删除链表的中间节点

给你一个链表的头节点 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 @ 2023-10-15 14:14  大熊猫同学  阅读(36)  评论(0编辑  收藏  举报