📅  最后修改于: 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)。