欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 建筑 > Leetcode19(亚马逊真题):删除链表的倒是第N个节点

Leetcode19(亚马逊真题):删除链表的倒是第N个节点

2025/4/27 17:51:52 来源:https://blog.csdn.net/weixin_57253447/article/details/147475497  浏览:    关键词:Leetcode19(亚马逊真题):删除链表的倒是第N个节点

题目分析

  • 删除节点关键:找到被删节点的前一个节点,指针指向

  • 虚拟头节点,方便删除头结点,形成统一操作

  1. 为啥要让快指针先行?

我认为更好懂的一种解释:快指针先行n步,这样快慢指针之间形成了一段长度为n的窗口,之后快慢指针同步向前相当于保持窗口长度不变。这样当快指针到达了末尾指向NULL,另一端的慢指针距离末尾的长度是n,自然就是指向倒数第n个位置了。

  1. 为啥快指针先行了n+1步?

由于单链表中的next指针指向的是下一个节点,想要删除倒数第n个节点,自然要将操作指针慢指针指向倒数第n+1个节点,这样才能进行删除操作。

  1. 虚拟头节点dummyHead的作用是?

如果单链表中要删除的节点是头节点,这个头节点正好是dummyHead的下一个节点,如此即可统一起来删除操作而不必单独考虑。

  1. 额外注意?

如果使用C++,最后记得释放删除的节点以及dummyHead

代码实现

易错点我也卸载注解里面了,记得应该 new  创建节点对象

class Solution {
public:ListNode* removeNthFromEnd(ListNode* head, int n) {// ListNode* dummyHead;   这只是定义内存,并么有初始化,ListNode* dummyHead = new ListNode(0);  //应该通过new 创建节点对象//虚拟头结点指向头结点的pre,为了删除头结点dummyHead->next = head;ListNode* fast = dummyHead;ListNode* slow = dummyHead;//快指针先走n+1步,形成n+1窗口大小for(int i=1; i<=n+1; i++){fast = fast->next;}//慢指针开始走,和fast同步走,永远必fast小n+1窗口大小,//那么当fast走到null末尾时,slow指针就是倒数第n+1个节点了while(fast != nullptr){fast = fast->next;slow = slow->next;}//此时slow指向倒数n节点的前一个节点,//即倒数N+1节点。然后通过slow删除slow->next = slow->next->next;return dummyHead->next;}
};

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词