题目描述
输入一个链表,输出该链表中倒数第k个结点。
解题思路
定义两个指针p1和p2,相隔k个结点的位置,p2在前。同时向前移动p1和p2,直到p2为NULL(尾后指针),此时p1指向链表倒数第k个结点。
需要注意的是,链表的长度可能不到k,这样就根本不存到倒数第k个结点,需要返回NULL。判断的方法是,在初始化p1和p2时,如果还没将p2移到相应的位置,就已经超过了链表尾部,则表明链表长度不够。
代码
/*
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 (k == 0 || !pListHead)
return NULL;
ListNode* p1 = pListHead;
ListNode* p2 = pListHead; //前后两个指针,相隔k个位置
int i = 0;
while (i < k && p2 != NULL) //将p2移动k个位置
{
p2 = p2->next;
i++;
}
if (i < k) //k大于链表长度
return NULL;
while (p2 != NULL) //同时移动p1和p2,直到p2为NULL,此时p1就是要输出的结点
{
p1 = p1->next;
p2 = p2->next;
}
return p1;
}
};