剑指 Offer 22. 链表中倒数第k个节点
题目链接
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/lian-biao-zhong-dao-shu-di-kge-jie-dian-lcof/submissions/
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题目描述
题目分析
- 两次遍历-麻烦
简单题。注意index的值,不是size-k+1。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* getKthFromEnd(ListNode* head, int k) {
int size = 0;
ListNode* cur = head;
while(cur != nullptr){
size++;
cur = cur->next;
}
cur = head;
int index = size - k;
while(index--){
cur = cur->next;
}
return cur;
}
};
- 一次遍历
更好。
快慢指针,双指针。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* getKthFromEnd(ListNode* head, int k) {
ListNode* dummy = new ListNode(0);
dummy->next = head;
ListNode* fast = dummy;
ListNode* slow = dummy;
for(int i = 1; i <= k ;i++){
fast = fast->next;
}
while(fast != nullptr){
slow = slow->next;
fast = fast->next;
}
return slow;
}
};