力扣_876. 链表的中间结点

力扣_876. 链表的中间结点

给你单链表的头结点 head ,请你找出并返回链表的中间结点。

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

输入:head = [1,2,3,4,5]

输出:[3,4,5]

解释:链表只有一个中间结点,值为 3 。

输入:head = [1,2,3,4,5,6]

输出:[4,5,6]

解释:该链表有两个中间结点,值分别为 3 和 4 ,返回第二个结点。

思路是遍历两次链表,第一遍用来统计链表长度size,对长度模运算判断是否为奇偶数后,第二遍遍历链表取中间结点;一开始还对使用了if判断,想着偶数的话节点取size/2+1,奇数节点取size/2,后来发现直接取size/2就行啦。

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 {
    
    public ListNode middleNode(ListNode head) {
        int size = 0;
        ListNode current = head;
        while (current != null) {
            size++;
            current = current.next;
        }
        int index = size / 2;
        ListNode cur = head;
        // 获取链表中某个位置的元素
        for (int i = 1; i <= index; i++) {
            cur = cur.next;
        }
        return cur;
    }
}

看了题解后发现还是快慢指针法牛,一开始还不明白为什么当快指针到达链表的末尾时,慢指针正好指向链表的中间节点。ai了一下懂了,假设链表的长度为 n。我们从头开始,快慢指针都指向链表的第一个节点。快指针的移动速度比慢指针快,因此,快指针的每一步移动相当于慢指针的两步。当快指针走到链表的末尾时,它已经走过了大约 n 步。慢指针每次只走一步,所以它的移动速度相对较慢。由于快指针走得更快,当快指针走到链表的末尾时,慢指针实际上已经走过了 n/2 步。在这段过程中,慢指针每次走一步,它会在快指针走 n 步时,正好走过 n/2 步。妙蛙种子!

相关推荐
点云SLAM8 小时前
算法与数据结构之二叉树(Binary Tree)
数据结构·算法·二叉树·深度优先·广度优先·宽度优先
羊锦磊8 小时前
[ 项目开发 1.0 ] 新闻网站的开发流程和注意事项
java·数据库·spring boot·redis·spring·oracle·json
小龙报9 小时前
《算法通关指南:算法基础篇 --- 一维前缀和 — 1. 【模板】一维前缀和,2.最大子段和》
c语言·数据结构·c++·算法·职场和发展·创业创新·visual studio
吴名氏.9 小时前
电子书《21天学通Java(第5版)》
java·开发语言·21天学通java
曼巴UE59 小时前
UE5 C++ JSON 最简单,麻烦的方式,直接读存(一)
java·服务器·前端
QMY5205209 小时前
什么是爬虫?
java·eclipse
bbq粉刷匠9 小时前
力扣--两数之和(Java)
java·leetcode
树在风中摇曳9 小时前
LeetCode 1658 | 将 x 减到 0 的最小操作数(C语言滑动窗口解法)
c语言·算法·leetcode
mzlogin9 小时前
解决访问 https 网站时,后端重定向或获取 URL 变成 http 的问题
java·后端·nginx
江湖独行侠9 小时前
认知神经科学解释生活中的现象——白月光、朱砂痣
java·服务器·生活·情绪