LeetCode动态图解---876. 链表的中间结点

本文探讨了如何在给定的非空单链表中寻找中间节点,包括使用线性遍历计算链表长度的方法一,以及利用快慢指针巧妙地找到中间节点的方法二。两种方法对比,适合不同场景的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

给定一个头结点为 head 的非空单链表,返回链表的中间结点。

如果有两个中间结点,则返回第二个中间结点。

方法一:

思路:

设长度为N,N / 2

例如,

5 / 2 = 2 -->从头结点开始走两步到中间点

6 / 2 = 3 -->从头结点开始走三步到中间点

无论链表是奇数还是偶数,只要拿到链表长度,从head开始开始走N / 2 步恰好走到中间节点。

代码:

public ListNode middleNode(ListNode head) {
        int count = 0;
        for (ListNode x = head; x != null; x = x.next) {
            count++;
        }
        ListNode middle = head;
        int middleIndex = count / 2;
        for (int i = 0; i < middleIndex; i++) {
            middle = middle.next;
        }
        return middle;
    }

方法二:

 快慢指针法

思路:

引入两个引用,让一个引用先走或者是多走几步,e.g. left 一次走两步, right 一次走一步,

当 left 走到 null 或是 left.next == null ,right 恰好走到中间位置。

 

public ListNode middleNode_pointer(ListNode head) {
        ListNode right = head;
        ListNode left = head;
        while (left != null && left.next != null) {
            left = left.next.next;
            right = right.next;
        }
        return right;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值