代码随想录算法练习Day10:删除链表的倒数第N个节点

题目链接:19.删除链表的倒数第N个节点

卡哥的视频讲解:链表遍历学清楚! | LeetCode:19.删除链表倒数第N个节点

题目思路:要找到删除的节点,就要知道它的上一个节点是什么,我开始的想法是把链表反转过来,直接删除第n个节点,但是这个操作就复杂了,可以直接使用快慢指针。假如要删除倒数第n个节点,则让快指针先走n+1步(+1是为了让慢指针指向被删除节点的前一个),再让快慢指针同时走,当快指针指向空时,慢指针就走到被删除节点的前一个了。(如下图)

分为以下几个步骤:

代码示例:

代码逻辑:

  1. delete 方法中,创建了一个虚拟头节点 dummyhead,其值为 -1,目的是方便后续操作。然后将虚拟头节点的 next 指针指向链表的头节点 head,这样可以确保链表不会因为删除节点而丢失头节点。

  2. 定义了两个指针 fastslow,它们都指向虚拟头节点 dummyhead。其中 fast 指针先向后移动 n+1 步,这样 fastslow 之间相差 n 个节点。

  3. 使用 while 循环遍历链表,当 fast 指针到达链表尾部时,slow 指针正好指向倒数第 n+1 个节点。

  4. 根据题目要求,需要删除倒数第 n 个节点。因此将 slow 指针的下一个节点指针指向下下个节点,即删除了倒数第 n 个节点。

  5. 最后,返回虚拟头节点的下一个节点,即链表的头节点,完成了删除操作。

总结:

一定是要让快指针走n+1步而不是n步,不然就无法让慢指针指向被删除节点的前一个了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值