输出单链表中倒数第k个结点

介绍了一种仅遍历一次单链表即可找到倒数第K个节点的方法,适用于带头结点的单链表。通过设置两个指针p和q,使p先移动K位后,再同步移动直至p到达尾部,此时q指向目标节点。

题目:输入带头结点的单链表L,输出该单链表中倒数第k个结点。单链表的倒数第0个结点为该单链表的尾指针。要求只能遍历一次单链表。


解题思路:
如果不要求只能遍历一次单链表,我们可以先遍历一次单链表,求出它的结点的总个数n(包括头结点),所以单链表的结点是从倒数第n-1个到倒数第0个,然后再遍历一次单链表,遍历时访问的第n-k-1个结点就是该单链表中倒数第k个结点。现在要求只能遍历一次单链表,可以设两个指针p和q,最开始时它们都指向头结点,然后p向后移动k位,最后p,q同时向后移动直到p为最后一个结点,那么此时q即为所求。


ADT定义如下
#define ElemType int
typedef struct LNode{
    ElemType data;
    LNode *next;
}LNode,*LinkList;


算法实现:

[cpp]  view plain copy
  1. LNode* reciprocalKNode(LinkList &L,int k)  
  2. {  
  3.     if(k<0) {  
  4.         printf("k不可以为负数");  
  5.         return NULL;  
  6.     }  
  7.     if(L==NULL)  
  8.     {  
  9.         printf("单链表为空");  
  10.         return NULL;  
  11.     }  
  12.     LNode* p=L;  
  13.     LNode* q=L;  
  14.     while(k>0)  
  15.     {  
  16.         p=p->next;  
  17.         if(p==NULL)  
  18.         {  
  19.             printf("单链表太短,不存在倒数第k个结点");  
  20.             return NULL;  
  21.         }  
  22.     }  
  23.     while(p->next!=NULL)  
  24.     {  
  25.         p=p->next;  
  26.         q=q->next;  
  27.     }  
  28.     return p;  
  29. }  

PS:这一题对于不带头结点的单链表的解法是一模一样的,只是我们通常用到的单链表都是带头结点而已。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值