剑指offer-链表中倒数最后k个结点C++实现
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) : val(x), next(nullptr) {}
};
class Solution {
public:
ListNode* FindKthToTail(ListNode* head, int k) {
ListNode *cur = head;
// 初始化链表长度
int size = 0;
// 链表长度
while(cur!=nullptr){
size++;
cur = cur->next;
}
// 根据题意,返回空链表
if(size<k)return nullptr;
cur = head;
// 根据size-k的思路查找目标
while(size>k){
cur = cur->next;
size--;
}
return cur;
}
};
思路:
这是一道简单的链表题,使用顺序查找即可实现,题目要求找的是倒数第k个结点,已知链表的长度为size,那么倒数第k个结点其实就是size-k个结点(下标从0开始,从1开始就是size-k+1),根据这个思路进行遍历就能定位到目标结点了。
时间复杂度O(n),空间复杂度O(1)
快慢指针解法
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) : val(x), next(nullptr) {}
* };
*/
class Solution {
public:
ListNode* FindKthToTail(ListNode* head, int k) {
fast = head;
slow = head;
// 快指针移动k步,到达第k+1个结点
while (fast != nullptr && k > 0) {
fast = fast->next;
k--;
}
// 若k长度大于0,则说明k的长度大于链表的长度
if(k>0)return nullptr;
// 当fast指针到达第k+1个结点时,slow指针和fast指针同步向后走,直到fast指针指向空时,返回slow指针的结点就是目标结点
while (fast != nullptr) {
fast = fast->next;
slow = slow->next;
}
return slow;
}
private:
ListNode *fast = nullptr;
ListNode *slow = nullptr;
};
思路:
利用快慢指针找到目标值,首先将快慢指针同时指向头部结点,然后让快指针走k步,到达第k+1个结点的位置,然后快慢指针同步向后走,当快指针指向空时,返回慢指针的结点就是目标结点了。