题目内容:删除链表的倒数第N个节点
- 我一开始的想法:先遍历整个链表,再用循环找到倒数第N个结点,但是链表基础不好,连循环都做不到,于是失败告终。
- 苦苦思索半天没有成果,只能打开题解,发现这道题有两种思路
- 第一种思路是找到整个链表的长度,然后根据List_length进行for循环,用cur删除后继节点,暴力简单,时间复杂度为O(n),但这种方法局限在只有知道整个链表长度才能进行删除操作,浪费时间太多。
- 第二种思路则是使用快慢指针,让快指针先遍历,遍历到第N个结点时开始对第二个指针遍历,这样两个指针之间相差的距离刚好为N个结点,快指针到达链表末尾时慢指针刚好到删除节点的前驱节点,这样再将慢指针的后继节点删除即可完成任务。时间复杂度为O(L),L为链表长度,空间复杂度为O(1)。
- 注意快慢指针while循环里最终first指针指向nullptr,所以for循环里i要从0开始。
-
class Solution { public: ListNode* removeNthFromEnd(ListNode* head, int n) { ListNode* dummy = new ListNode(0, head); ListNode* first = head; ListNode* second = dummy; for (int i = 0; i < n; ++i) { first = first->next; } while (first) { first = first->next; second = second->next; } second->next = second->next->next; ListNode* ans = dummy->next; delete dummy; return ans; } };