题解 | #删除链表的倒数第n个节点#
删除链表的倒数第n个节点
https://www.nowcoder.com/practice/f95dcdafbde44b22a6d741baf71653f6
class Solution { public: ListNode* removeNthFromEnd(ListNode* head, int n) { auto newhead = new ListNode(-1); newhead->next = head; auto slow = newhead; auto fast = newhead; for (int i = 0; i<n+1; ++i) { fast = fast -> next; } if(fast == nullptr) return head->next; while (fast) { fast = fast->next; slow = slow->next; } slow->next = slow->next->next; return head; } };
快慢指针,一个先移动n次,保持两个指针间距,然后一起往后移动。当快指针到空时,慢指针就是倒数n+1个,如何删除第n个
倒数n+1->倒数n->倒数n-1。(倒数n+1)->next=(倒数n+1)->next->next,这样就变成(倒数n+1)->(倒数n-1)。返回的是链表头。head。
if(fast == nullptr) return head->next;
当快指针向后移动到n+1时,恰好到空 。说明当时链表长度就是n,也就是倒数n就是头节点,所以去掉这个倒数n,
就是返回head->next;因为题目保证n是有效的就说明链表长度大于等于n。不需要考虑不够n的情况。