之前刚见到一个237. 删除链表的节点,
不同之处在于237没有给链表,只给了要删除的节点。
而本题给了链表,和要删除的节点(中间位置的节点)。
思路:
要删除的是中间位置的节点,所以要先找到中间的位置。
如果是数组就方便很多,直接数组长度/2,
但是单向链表并不知道长度,除非遍历一遍去数,然后找中间节点又要再遍历一遍。
有木有遍历一遍就直接到达中间节点位置的方法?快慢指针。
快指针一步走2个节点,慢指针一步走1个。
注意要停在中间节点的前一个位置,这样才能删除中间节点。
public ListNode deleteMiddle(ListNode head) {
if(head.next == null) return null;
ListNode fast = head.next.next;
ListNode slow = head;
while(fast != null && fast.next != null) {
fast = fast.next.next;
slow = slow.next;
}
ListNode slowNext = slow.next; //只改指针,不删除的话可注释掉这一步
slow.next = slow.next.next;
slowNext.next = null; //只改指针,不删除的话可注释掉这一步
return head;
}