来源:牛客网
题目描述
输入一个链表,输出该链表中倒数第k个结点。
思路1:(效率慢)
可以先遍历求出链表中有多少个结点,第二次再从前往后走,让count–,直到count=k,则找到了该结点。
class Solution {
public:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
unsigned count = 0;//计算一共有多少个结点
ListNode* cur = pListHead;
while (cur)
{
count++;
cur = cur->next;
}
ListNode* p = pListHead;
while (count != k&&p)
{
p = p->next;
count--;
}
return p;
}
};
思路2:快慢指针
定义两个指针放到头结点的位置,让一个指针先走k步停下来。这时,两指针差k步(慢指针在头结点的位置,快指针在距离慢指针k步的位置),让它们同时向后一步步走,当快指针走到结尾,慢指针就在倒数第K个结点的位置了。
class Solution {
public:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
ListNode* fast = pListHead;
ListNode* slow = pListHead;
while (k--)//链表为空以及K==0在这个循环里就一起检测了
{
if (fast) fast = fast->next;
else return NULL;
}
while (fast)
{
slow = slow->next;
fast = fast->next;
}
return slow;
}
};