题目来源
面试题22. 链表中倒数第k个节点
面试题 02.02. 返回倒数第 k 个节点
题目描述
struct ListNode {
int val;
ListNode *next;
ListNode() : val(0), next(nullptr) {}
ListNode(int x) : val(x), next(nullptr) {}
ListNode(int x, ListNode *next) : val(x), next(next) {}
};
class Solution {
public:
ListNode* getKthFromEnd(ListNode* head, int k) {
}
};
题目解析
递归(推荐)
使用后序遍历到寻找倒数第k个节点
class Solution {
public:
int count = 0;
ListNode* ans = nullptr;
ListNode* getKthFromEnd(ListNode* head, int k) {
if(head == nullptr || k == 0){
return NULL;
}
getKthFromEnd(head->next, k);
count++;
if(count == k){
ans = head;
}
return ans;
}
};
双指针(推荐)
//思路:快慢指针法。消除长度差,当快指针到达末尾时,慢指针正好指向倒数第k个元素。
ListNode* getKthFromEnd(ListNode* head, int k) {
ListNode * front = head;
ListNode * back = head;
int i = 1;
while (i <= k){
if(front == nullptr){
return nullptr;
}
front = front->next;
i++;
}
while (front != nullptr){
front = front->next;
back = back->next;
}
return back;
}
常规解法(不看)
先统计长度,再找准对应节点
class Solution {
public ListNode getKthFromEnd(ListNode head, int k) {
ListNode temp = head;
int count = 1;
while(temp != null){
temp = temp.next;
count++;
}
ListNode back = head;
int p = 2;
while(p != count - k + 1){
back = back.next;
p++;
}
return back;
}
}
public ListNode getKthFromEnd(ListNode head, int k) {
ListNode slow=head,fast=head;
int t = 0;
while(fast!=null){
if(t>=k) slow=slow.next;
fast = fast.next;
t++;
}
return slow;
}