leetcode 19 Remove Nth Node From End of List
题干:
移除链表的倒数第n个节点。
Input: head = [1,2,3,4,5], n = 2
Output: [1,2,3,5]
解:
借助快慢指针。*fast比*slow快k步,当*fast到NULL时,*slow正好到倒数第k个。
因为涉及到对头节点的操作,所以用到dummy node。
另外,为了删除方便,找的不是倒数第k个而是倒数第(k+1)个。
ListNode* findFromEnd(ListNode* head, int k){ // 返回链表的倒数第k个节点
ListNode* fast = head, *slow = head;
for(int i = 1; i <= k; i ++) fast = fast->next; // fast先走k步
while(fast){
fast = fast->next;
slow = slow->next;
}
return slow;
}
ListNode* removeNthFromEnd(ListNode* head, int n){
ListNode *dummy = new ListNode(-1, head);
ListNode *cur = findFromEnd(dummy, n + 1); // 删除倒数第n个,要先找倒数第(n+1)个节点
ListNode* tmp = cur->next;
cur->next = cur->next->next;
delete(tmp);
return dummy->next;
}
当然,用递归也能做。