剑指offer—链表中的倒数第k个结点
输入一个链表,输出该链表中倒数第k个结点。
博客中代码均在牛客C++11(clang++ 3.9)中通过
因为是单向链表,所以就不能从后往前遍历了。我们可以遍历两遍链表,第一遍得出链表的总长度n,这样就可以计算出n-k的值,第二遍遍历时就能找到该结点了。
但是如果只能遍历一遍数组呢?这时候我们就需要两个指针来做了,让第一个指针先前进k-1步,然后两个指针同时前进,当第一个指针指向最后一个结点时,第二个指针指向的位置就是倒数第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(nullptr == pListHead || k == 0)
return nullptr;
ListNode* p1 = pListHead;
ListNode* p = pListHead;
for(int i = 0;i<k-1;++i)
{
if(nullptr != p1->next)
p1 = p1->next;
else
return nullptr;
}
while(nullptr != p1->next)
{
p1 = p1->next;
p = p->next;
}
return p;
}
};