之前的实现方法在这里LeetCode 19.删除链表的倒数第N个节点
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode vhead,*quick = &vhead,*slow = &vhead;
vhead.next = head;
for(int i = 0;i < n;i++)
{
slow = slow->next;
}
while(slow->next)
{
slow = slow->next;
quick = quick->next;
}
quick->next = quick->next->next;
return vhead.next;
}
-
定义变量:
ListNode* removeNthFromEnd(ListNode* head, int n)
: 函数接受一个链表的头节点head
和一个整数n
作为参数。ListNode vhead,*quick = &vhead,*slow = &vhead;
: 这里定义了一个虚拟头节点vhead
,它的作用主要是简化边界条件的处理。quick
和slow
是两个指针,初始时都指向虚拟头节点。
-
初始化快慢指针:
vhead.next = head;
: 将虚拟头节点的next
指向原链表的头节点。for(int i = 0;i < n;i++)
: 这个循环将slow
指针向前移动n
个节点。slow = slow->next;
: 移动slow
指针。
-
同时移动快慢指针:
while(slow->next)
: 当slow
指针不是链表的最后一个节点时,继续循环。slow = slow->next;
: 移动slow
指针。quick = quick->next;
: 移动quick
指针。
- 这样,当
slow
指针到达链表的尾部时,quick
指针就指向了倒数第n+1个节点。
-
移除倒数第n个节点:
quick->next = quick->next->next;
: 由于quick
指针指向倒数第n+1个节点,所以quick->next
就是倒数第n个节点。这行代码就是将倒数第n个节点从链表中移除。
-
返回结果:
return vhead.next;
: 返回修改后的链表的头节点。
- 这个函数的时间复杂度是O(N),其中N是链表的长度。因为我们最多遍历了两次链表,一次是移动
slow
指针,另一次是同时移动slow
和quick
指针。空间复杂度是O(1),因为我们只使用了常量级的额外空间。