876.链表的中间节点

题目

Python

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def middleNode(self, head: Optional[ListNode]) -> Optional[ListNode]:
        slow = fast = head
        while fast and fast.next:
            slow = slow.next
            fast = fast.next.next
        
        return slow
### 找到单向链表中间节点的算法实现 要找到单向链表中间节点,可以使用双指针技术。该方法的核心思想是定义两个指针 `slow` 和 `fast`,初始时均指向链表头部。在遍历过程中,`fast` 指针每次向前移动两步,而 `slow` 指针每次仅前进一步。当 `fast` 到达链表末尾时,`slow` 将正好位于链表的中间位置[^1]。 以下是基于此逻辑的具体代码实现: ```java public class ListNode { int val; ListNode next; public ListNode(int val) { this.val = val; this.next = null; } } public class MiddleNodeFinder { public static ListNode findMiddle(ListNode head) { if (head == null || head.next == null) { return head; // 链表为空或者只有一个节点的情况 } ListNode slow = head, fast = head; while (fast != null && fast.next != null) { // 循环条件确保不会越界 slow = slow.next; // 慢指针每次前进一步 fast = fast.next.next; // 快指针每次前进两步 } return slow; // 当快指针到达终点时,慢指针即为中间节点 } public static void main(String[] args) { // 构建一个简单的链表:1 -> 2 -> 3 -> 4 -> 5 ListNode head = new ListNode(1); head.next = new ListNode(2); head.next.next = new ListNode(3); head.next.next.next = new ListNode(4); head.next.next.next.next = new ListNode(5); ListNode middle = findMiddle(head); // 调用函数寻找中间节点 System.out.println("中间节点的值:" + middle.val); // 输出应为 3 } } ``` #### 关键点解释 - **时间复杂度**:由于 `fast` 每次跳跃两次,`slow` 只需遍历一半的链表即可完成操作,整体的时间复杂度为 O(n)[^1]。 - **空间复杂度**:除了原链表外未引入其他辅助存储结构,因此空间复杂度为 O(1)[^1]。 - 对于偶数长度的链表,最终返回的结果将是中间两个节点中的第一个节点[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值