力扣876. 链表的中间结点

目录

题目描述

题解一:快慢指针

​题解二:


题目描述

力扣876. 链表的中间结点_第1张图片

示例

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

输出:[3,4,5]

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

输出:[4,5,6]

提示:给定的链表节点数介于 1 - 100之间

题解一:快慢指针

快指针一次两步, 慢指针一次一步。

快指针结束条件有两个:

① fast.next == null :代表链表节点个数为奇数,循环结束时慢指针正好走到中间

②fast.next.next == null :代表链表节点个数为偶数,循环结束时慢指针正好走到中间的前一个

力扣876. 链表的中间结点_第2张图片

力扣876. 链表的中间结点_第3张图片

class Solution {
    public ListNode middleNode(ListNode head) {
        if (head == null) return head; // 为空直接退出

        ListNode fast = head; // 快指针
        ListNode slow = head; // 慢指针

        // 设置退出条件
        while (fast.next != null && fast.next.next != null) {
            fast = fast.next.next;
            slow = slow.next;
        }

        if (fast.next == null) {
            // 链表节点为奇数个,返回本身
            return slow;
        } else{
            // 链表节点为偶数个,返回下一个
            return slow.next;
        } 
    }
}

力扣876. 链表的中间结点_第4张图片

题解二:

先走一遍确认链表个数,再走一遍返回中间节点

①偶数:假如为6,走6 / 2 = 3 步,到达指定节点

②奇数:假如为5,走5 / 2 = 2 步,到达指定节点

力扣876. 链表的中间结点_第5张图片

class Solution {
    public ListNode middleNode(ListNode head) {
        
        ListNode p = head;
        int count = 1;
        while(p.next != null) {
            count ++;
            p = p.next;
        }
        count /= 2;
        p = head;
        for (int i = 0; i < count; i ++) {
            p = p.next;
        }
        return p;
    }
}

力扣876. 链表的中间结点_第6张图片

你可能感兴趣的:(leetcode)