题目链接:2095. 删除链表的中间节点(中等)
算法原理:
解法:复用876题代码
4ms击败95.21%
时间复杂度O(N)
前置题目:A.每日一题:876. 链表的中间结点+2130. 链表最大孪生和 中的876题
为了删除链表的中间节点,我们需要让慢指针少走一步,最终落到中间节点的前一个节点,然后越过后面一个节点,就能完成"删除"的效果~~
咋让慢指针少走一步??可以让快指针走两步,少循环一次,这样就等同于慢指针少走一步了
特别的,当只有一个节点的时候,快指针没办法走两步,需要特殊判断,返回 null
Java代码:
java
/**
* 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 {
//2095. 删除链表的中间节点
public ListNode deleteMiddle(ListNode head) {
//只有一个节点
if(head.next==null) return null;
//876.链表的中间结点
//本题先让快指针走两步,慢指针少走一步,这样最终刚好落在中间节点的前一个节点
ListNode fast=head.next.next,slow=head;
while(fast!=null&&fast.next!=null){
slow=slow.next;
fast=fast.next.next;
}
slow.next=slow.next.next;//删除slow的下一个
return head;
}
}