题目描述
输入一个链表,输出该链表中倒数第k个结点。
思想:
n,n-1,………,k+1, k, k-1,……3,2,1
倒数第k个结点;
前面需要走n-k+1;
定义两个指针p1,p2,开始均指向首节点,先让p1移动到指向第k个节点,然后p1,p2同时移动,p1移动到第n个结点时,刚好移动了n-k+1,此时p2也移动n-k+1,则此时p2刚好指向倒数第k个结点。
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k)
{
if(pListHead==NULL||k==0)
return NULL;
//定义两个指针p1,p2,开始均指向首节点,
ListNode*p1 = pListHead;
ListNode*p2 = pListHead;
//先让p1移动到指向第k个节点,
for (int i = 1; i < k; i++) // i = 1开始的,自己画画就明白了
{
if(p1->next!=NULL)
p1=p1->next;
else
return NULL;
}
//然后p1,p2同时移动,p1移动到第n个结点时,刚好移动了n-k+1,
//此时p2也移动n-k+1,则此时p2刚好指向倒数第k个结点。
while(p1->next!=NULL)
{
p1=p1->next;
p2=p2->next;
}
return p2;
}
};