找链表的倒数第k个节点???
思路:遍历一遍链表,得到链表的长度len, 再用长度len减掉k就是需要走多少步就能倒数第k个节点的位置了。
如图有一个链表,有效数据长度 len为5;假设现在要找倒数第三个节点。即k为3;
如果当前指针指向头节点,则需要走len-k+1步(值为3),才能到倒数第k个节点
如果指向的是第一个有效数据节点,则需要走len-k(值为2)步。
node * Find_tail_K(P plist,unsigned int k)
{
if(NULL == plist || k<1)
{
return NULL;
}
int count=0;
for(node *p=plist->pnext;p!=NULL;p=p->pnext)
{
count++;
}
if(count<k)
{
return NULL;
}
int tmp=count-k;
node *q=plist->pnext;//第二种情况,从第一个有效节点开始
for( int i=1;i<=tmp;i++)
{
q=q->pnext;
}
return q;
}
到这里就算是完成了题目要求,但是现在只要求遍历一次链表,有应该如何实现呢??(上面一共遍历了两遍链表)
思路:定义两个指针p1、p2都指向第一个有效节点,然后p2先走k-1步,这样就能保证p1和p2之间一共有k个节点了(包括p1,p2),然后两个指针同时走,当p2走到尾的时候,p1指向的节点就是倒数第k个节点。
node * find_tail_k(P plist,unsigned int k)
{
if(NULL == plist ||k<1)
{
return NULL;
}
node *p1=plist->pnext;
node *p2=plist->pnext;
for(int i=1;i<k;i++)
{
if(p2->pnext!=NULL)
p2=p2->pnext;
else
return NULL;
}
for(;p2->pnext!=NULL;p2=p2->pnext)
{
p1=p1->pnext;
}
return p1;
}
扫描二维码关注公众号,回复:
2772557 查看本文章