📜  删除链表中间的Java程序(1)

📅  最后修改于: 2023-12-03 14:50:21.288000             🧑  作者: Mango

删除链表中间的节点

有一个单向链表,现在要求删除其中间的节点,要求不能使用临时缓存。

思路

由于不能使用临时缓存,因此我们无法在遍历链表时保存前驱节点。所以,我们需要使用双指针的方式来找到要删除的节点。

我们可以维护两个指针slow和fast,初始都指向头节点。fast指针一次走两步,slow指针一次走一步,当fast指针到达链表尾部时,slow指针正好指向链表中间位置的节点。此时,我们可以删除slow指向的节点。

代码实现
public ListNode removeMidNode(ListNode head) {
    if (head == null || head.next == null) {
        return head;
    }

    ListNode slow = head;
    ListNode fast = head;

    while (fast.next != null && fast.next.next != null) {
        slow = slow.next;
        fast = fast.next.next;
    }

    slow.next = slow.next.next;

    return head;
}
性能分析

时间复杂度:O(n),其中n为链表长度。

空间复杂度:O(1)。