题目
输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。
例如,一个链表有6
个节点,从头节点开始,它们的值依次是1、2、3、4、5、6
。这个链表的倒数第3
个节点是值为4
的节点。
题解
思路1:先遍历计数再从头走size - k
步,复杂度为O(2n - k)
ListNode* getKthFromEnd(ListNode* head, int k) {
ListNode *p = head;
int size = 0;
while(p != nullptr){
p = p->next;
size++;
}
for(int i = 0; i < size - k; i++)
head = head->next;
return head;
}
思路2:双指针!快指针先行k
步,保持与慢指针k
步的距离。快指针走到结尾时满指针即为目标节点。复杂度同样为O(2n - k)
ListNode* getKthFromEnd(ListNode* head, int k) {
ListNode *fast = head;
int step = 0;
while(step < k){
fast = fast->next;
step++;
}
while(fast != nullptr){
fast = fast->next;
head = head->next;
}
return head;
}