删除链表的中间节点 Java实现_【链表问题】删除单链表的中间节点

前言

以专题的形式更新刷题贴,欢迎跟我一起学习刷题,相信我,你的坚持,绝对会有意想不到的收获。每道题会提供简单的解答,如果你有更优雅的做法,欢迎提供指点,谢谢。

【题目描述】

给定链表的头节点head,实现删除链表的中间节点的函数。

例如:

步删除任何节点;

1->2,删除节点1;

1->2->3,删除节点2;

1->2->3->4,删除节点2;

1->2->3->4-5,删除节点3;

【要求】

如果链表的长度为 N, 时间复杂度达到 O(N), 额外空间复杂度达到 O(1)

【难度】

士:★☆☆☆

【解答】

这道题要求删除中间节点,我们可以采用双指针的方法来做,就是用一个快指针和一个慢指针,快指针每次前进两个节点,而慢指针每次前进一个节点。当快指针遍历完节点时,慢指针刚好就在中间节点了。之前写过一篇一些常用的算法技巧总结也有所过指针使用的一些技巧。

不过在做的时候,最好是先把一些特殊情况先处理好,例如删除的可能是第一个节点,也有可能不用删除节点(只有一个节点时就不用删除了。

代码如下public static Node removeMidNode(Node head) {

if(head == null || head.next == null)

return head;

if (head.next.next == null) {

return head.next;

}

Node fast = head.next.next;//快指针

Node slow = head;//慢指针

//slow最终指向中间节点的前驱

while (fast.next != null && fast.next.next != null) {

slow = slow.next;

fast = fast.next.next;

}

//进行删除

slow.next = slow.next.next;

return head;

}上次那道删除倒数第 K 个节点的题(【链表问题】删除单链表中的第K个节点) 其实也是可以使用双指针的,但个人认为,那道题使用双指针的方法并没有我上次那个做法优雅,而这次删除中间节点,则用双指针比较优雅。至于原因,可以自己打下代码看看。

之所以说这个事,是因为有人跟我题双指针的建议,我是非常欢迎有人给我提建议的,不过你的建议如何。不过一上来就说我那篇文章太敷衍,我也是醉了。我开头已经说了,只提供简单的解答,而且也把刷题的文章放到次条了。

问题拓展

题目:删除链表中 a / b 处的节点

【题目描述】

给定链表的头节点 head、整数 a 和 b,实现删除位于 a/b 处节点的函数。

例如:

链表:1->2->3->4->5,假设 a/b 的值为 r。

如果 r = 0,不删除任何节点;

如果 r 在区间 (0,1/5] 上,删除节点 1;

如果 r 在区间 (1/5,2/5] 上,删除节点 2;

如果 r 在区间 (2/5,3/5] 上,删除节点 3;

如果 r 在区间 (3/5,4/5] 上,删除节点 4;

如果 r 在区间 (4/5,1] 上,删除节点 5;

如果 r 大于 1,不删除任何节点。

【要求】

如果链表的长度为 N, 时间复杂度达到 O(N), 额外空间复杂度达到 O(1)

【难度】

士:★☆☆☆

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值