本文共 1188 字,大约阅读时间需要 3 分钟。
为了找到单链表的中点,使用快慢指针的方法是高效且简洁的。以下是优化后的解释和实现:
我们使用快慢指针的方法来解决这个问题。快指针每次移动两步,慢指针每次移动一步。当快指针到达链表末尾时,慢指针正好停在中点或中点前一个节点的位置。具体步骤如下:
dummy,将其下一个指向链表的头节点。slow 和 fast 都从 dummy 开始。fast 未到达末尾且下一个节点也未到达末尾时,移动 slow 和 fast 分别一步和两步。fast 到达末尾时,停止循环。slow 或 slow.next: fast 到达末尾,说明链表长度为奇数,返回 slow。slow.next。这种方法的时间复杂度为 O(n),空间复杂度为 O(1),非常高效。
public class Solution { public ListNode middleNode(ListNode head) { ListNode dummy = new ListNode(0); ListNode slow = dummy; ListNode fast = dummy; dummy.next = head; while (fast != null && fast.next != null) { slow = slow.next; fast = fast.next.next; } return fast == null ? slow : slow.next; }}class ListNode { int val; ListNode next; ListNode(int x) { val = x; next = null; }} dummy:用于简化边界条件处理,确保链表的头节点可以直接从 dummy 开始遍历。slow 和 fast 都从 dummy 开始,分别以一步和两步的速度移动。fast 未达到末尾且 fast.next 未达到末尾时,继续移动指针。slow 移动一步,fast 移动两步,直到 fast 到达末尾。fast 到达末尾时,循环结束。fast 是否为 null,决定返回 slow 还是 slow.next,确保在奇数和偶数长度的链表中都能正确返回中点。这种方法确保了在 O(n) 时间和 O(1) 空间内高效地找到链表的中点。
转载地址:http://hqds.baihongyu.com/