5

【链表篇】LeetCode 876、链表的中间结点

 1 year ago
source link: https://www.cxyxiaowu.com/21834.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
【链表篇】LeetCode 876、链表的中间结点

通知:吴师兄学算法训练营第十期开启报名,预计 12 月 20 开营,解锁 400 题。

一、题目描述

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

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

输入:[1,2,3,4,5]
输出:此列表中的结点 3 (序列化形式:[3,4,5])
返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。
注意,我们返回了一个 ListNode 类型的对象 ans,这样:
ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.next.next.next = NULL.
输入:[1,2,3,4,5,6]
输出:此列表中的结点 4 (序列化形式:[4,5,6])
由于该列表有两个中间结点,值分别为 3 和 4,我们返回第二个结点。
  • 给定链表的结点数介于 1100 之间。

二、题目解析

我个人认为这道题目是最好理解快慢指针这个知识点了。

废话不多说,直接先来看动画演示!

【链表篇】LeetCode 876、链表的中间结点

根据这个动画,不难理解整体的思路如下:

1、设置两个指针,一开始都指向链表的头节点;

2、接下来,让这两个指针向前移动;

3、如果可以移动,那么就会让快指针每次移动两步,慢指针每次移动一步;

4、而快指针可以移动两步的前提就是当前节点不为空,同时下一节点也不为空,这样才能保证 fast.next 有值、fast.next.next 有值

5、最后,slow 指向的就是中间节点。

三、参考代码

// LeetCode 100 题精讲:https://mp.weixin.qq.com/s/yznC53g46phq3qF7V4-obA
// 作者:程序员吴师兄
// 链表的中间结点(LeetCode 876):https://leetcode.cn/problems/middle-of-the-linked-list/
class Solution {
    public ListNode middleNode(ListNode head) {

// 设置两个指针,一开始都指向链表的头节点
        ListNode slow = head;

ListNode fast = head;

// 接下来,让这两个指针向前移动
        // 如果可以移动,那么就会让快指针每次移动两步,慢指针每次移动一步
        // 而快指针可以移动两步的前提就是当前节点不为空,同时下一节点也不为空
        // 这样才能保证 fast.next 有值、fast.next.next 有值
        while(fast != null && fast.next != null){

// 慢指针每次移动一步
            slow = slow.next;

// 快指针每次移动两步
            fast = fast.next.next;
        }

// 最后,slow 指向的就是中间节点
        return slow;

}
}
202203130818472.jpeg

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK