删除链表的中间节点
给你一个链表的头节点 head 。删除 链表的 中间节点 ,并返回修改后的链表的头节点 head 。
思路
双指针,快慢指针。pre 指针记录待删除节点的前缀。
- slow 指向 head
- fast 指向 head.next,注意一定要是 head.next
- slow 每次移动一个节点,fast 每次移动2个节点。当 fast 为 null 时,slow 此时刚好指向中间节点
- 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;
}
}