链表
1、删除链表中的某一个节点:删除链表的某一个节点一般分为三种情况,待删除节点为中间节点、头节点、尾结点。
(1)待删除节点为中间节点的时候:可已用O(1)的时间复杂度去删除它。通过待删除节点,找到其后一个节点,然后将后一个节点覆盖到该节点即可达到删除的效果。
补充:普通的思路删除这个节点是从前往后遍历,找到这个节点的前一个节点,修改前一个节点的指针。这样需要遍历,时间复杂度是o(n),这种方法时间复杂度过高,不去使用。
(2)待删除节点为尾结点:这种只能从前往后遍历,找到该节点的前一个节点,将其next指针修改成null,时间复杂度为o(n)。
(3)待删除节点为头节点:这时候要将其值和next指针全置空,时间复杂度为O(1)。
因此,最坏的时间复杂度只有一种情形,就是在删除尾结点的时候。因此,可以计算删除链表节点的平均时间复杂度,((n-1)O(1)+O(n))/n,平均时间复杂度仍然为O(1)。
补充:在程序中判断这个节点是什么类型的节点只需要取pNode.next,若为空,那就是尾结点;若不为空,就是中间节点;若phead=pToBeDelete,那就是头节点。
2、链表常见的操作:
1、翻转链表:
public static ListNode reverseListNode(ListNode head) { ListNode newHead = null; while (head != null) { ListNode next = head.next; head.next = newHead; newHead = head; head = next; } return newHead; }
2、删除链表中的某一个节点:
删除的时候提前保存好下一个节点
3、快慢指针寻找链表的中间节点:
public static ListNode findMidNode(ListNode head) { ListNode slow = head; ListNode fast = head; while (fast.next != null && fast.next.next != null) { slow = slow.next; fast = fast.next.next; } return slow; }
4、快慢指针判断链表是否有环:
。。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)