【链表问题】删除单链表的中间节点

发布时间:2025-09-02 01:13:06 作者:益华网络 来源:undefined 浏览量(0) 点赞(0)
摘要:前言 以专题的形式更新刷题贴,欢迎跟我一起学习刷题,相信我,你的坚持,绝对会有意想不到的收获。每道题会提供简单的解答,如果你有更优雅的做法,欢迎提供指点,谢谢。 【题目描述】 给定链表的头节点head,实现删除链

前言

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

【题目描述】

给定链表的头节点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)

【难度】

士:★☆☆☆

二维码

扫一扫,关注我们

声明:本文由【益华网络】编辑上传发布,转载此文章须经作者同意,并请附上出处【益华网络】及本页链接。如内容、图片有任何版权问题,请联系我们进行处理。

感兴趣吗?

欢迎联系我们,我们愿意为您解答任何有关网站疑难问题!

您身边的【网站建设专家】

搜索千万次不如咨询1次

主营项目:网站建设,手机网站,响应式网站,SEO优化,小程序开发,公众号系统,软件开发等

立即咨询 15368564009
在线客服
嘿,我来帮您!