题目
第一步,我们先让一个指针 p1 指向链表的头节点 head,然后走 k 步:
第二步,用一个指针 p2 指向链表头节点 head:
第三步,让 p1 和 p2 同时向前走,p1 走到链表末尾的空指针时走了 n - k 步,
p2 也走了 n - k 步,也就是链表的倒数第 k 个节点:
代码(首刷自解)
class Solution {
public:
ListNode* getKthFromEnd(ListNode* head, int k) {
auto fast = head;
auto slow = head;
for(int i = 0; i < k; i++)
fast = fast->next;
while(fast != nullptr) {
fast = fast->next;
slow = slow->next;
}
return slow;
}
};
代码(8.8 二刷自解)
class Solution {
public:
ListNode* FindKthToTail(ListNode* pHead, int k) {
auto fast = pHead;
for(int i = 0; i < k; i ++) {
if(!fast) return nullptr;
fast = fast->next;
}
while(fast) {
fast = fast->next;
pHead = pHead->next;
}
return pHead;
}
};
GO
func getKthFromEnd(head *ListNode, k int) *ListNode {
fast := head
for k != 0 {
if fast == nil {
return nil
}
fast = fast.Next
k--
}
for fast != nil {
fast = fast.Next
head = head.Next
}
return head
}
代码(9.9 三刷自解)
class Solution {
public:
ListNode* getKthFromEnd(ListNode* head, int k) {
auto res = head;
for(int i = 0; i < k; i++)
head = head->next;
while(head) {
head = head->next;
res = res->next;
}
return res;
}
};