题目描述
输入一个链表,输出该链表中倒数第k个结点。
思路:假设链表的总结点个数为n,倒数第k个结点即正数第n-k+1=n-(k-1)个结点。如何在一次遍历的情况下就找到倒数第k个结点呢?
方法:定义两个指针,p和q,让p先走k-1步,剩下n-(k-1)步即到达终点,同时这n-(k-1)步也是正着走能找到倒数第k个结点的步数。
所以当p到达终点的时候,q到达的结点即为所求。
代码:
在没有特殊声明时,均将pListHead看作是链表的第一个结点
class Solution {
public:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {//注意pListNode是链表的头结点。
if(pListHead==NULL)
return NULL;
if(k==0)
return NULL;
ListNode *p=pListHead;
ListNode*q=pListHead;
//unsigned int n=k-1;
while(k-->1) //当k==0和k==1时均不执行此语句,故要对k==0单独考虑
{
p=p->next;
if(p==NULL)
return NULL;
}
while(p->next)
{
p=p->next;
q=q->next;
}
return q;
}
};