删除链表的中间节点

给你一个链表的头节点 head 。删除 链表的 中间节点 ,并返回修改后的链表的头节点 head 。

思路

双指针,快慢指针。pre 指针记录待删除节点的前缀。

  1. slow 指向 head
  2. fast 指向 head.next,注意一定要是 head.next
  3. slow 每次移动一个节点,fast 每次移动2个节点。当 fast 为 null 时,slow 此时刚好指向中间节点
  4. 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;
    }
}
posted @   大熊猫同学  阅读(39)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
历史上的今天:
2016-10-15 最近一段时间代码汇总
点击右上角即可分享
微信分享提示