删除链表的中间节点
给你一个链表的头节点 head 。删除 链表的 中间节点 ,并返回修改后的链表的头节点 head 。
思路
双指针,快慢指针。pre 指针记录待删除节点的前缀。
- slow 指向 head
- fast 指向 head.next,注意一定要是 head.next
- slow 每次移动一个节点,fast 每次移动2个节点。当 fast 为 null 时,slow 此时刚好指向中间节点
- pre 指针指向 slow 的前缀,方便删除
代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode deleteMiddle(ListNode head) {
ListNode slow = head;
//当 fast 为 null 时,刚好 slow 指向中间节点。
ListNode fast = head.next;
//指向待删除节点的 前缀节点
ListNode pre = null;
while(slow != null && fast != null){
//pre 指向中间节点的 前缀节点
pre = slow;
//slow 走1步
slow = slow.next;
fast = fast.next;
if(fast != null){
//fast 走2步
fast = fast.next;
}
}
if(pre == null){
//list 只有一个节点
return null;
}
//delete node
pre.next = slow.next;
return head;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
2016-10-15 最近一段时间代码汇总