题目描述
输入一个链表,输出该链表中倒数第k个结点。
思路1
走两次。第一次确定链表长度listLength,第二次走listLength-k步。
具体思路可以参考我另外一篇博文:
https://blog.csdn.net/songsong2017/article/details/86747833
思路1的代码
/*
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 || k == 0)
return nullptr;
int listLength = 0;
ListNode* help = pListHead;
while (pListHead){
listLength++;
pListHead = pListHead->next;
}
if (k > listLength){
return nullptr;
}
else if (k == listLength){
return help;
}
else{
int step = listLength - k;
while (step){
help = help->next;
step--;
}
}
return help;
}
};
思路2
双指针。为了考虑可能删除的是第一个结点,所以设置一个头节点。让快慢指针指向这个头节点,先让快指针走K步,这样就确保了两个指针的距离为K,然后让快慢指针一起走,当快指针走完后,慢指针指向的结点即所求。
思路2的代码
/*
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 == nullptr || k < 1) return nullptr;
ListNode* fake = new ListNode(-1);
fake->next = pListHead;
auto slow = fake, quick = fake;
while (k--){
quick = quick->next;
if (quick == nullptr) return nullptr;
}
while (quick){
quick = quick->next;
slow = slow->next;
}
return slow;
}
};