876.链表的中间结点

题目:

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

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

示例 1:

输入:[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.

思路:
我们先获取到链表的总长度,然后在新建一个结点,使得这个节点指向链表的终结位置就可以了。

class Solution {
    public ListNode middleNode(ListNode head) {
        if (head == null) {
            //如果链表为空
            return null;
        }
        
        //获取链表的总长度
        int len = size(head);
        
        ListNode node = head;
        for (int i = 0; i < len / 2; i++) {
            node = node.next;
        }
        return node;
    }
    
    public int size(ListNode head) {
        int size = 0;
        for (ListNode node = head; node != null; node = node.next) {
            size++;
        }
        return size;
    }
}

我们发现当链表指向 len / 2位置的结点,不论这个链表长度是奇数还是偶数都满足题意。
结果如下图:
在这里插入图片描述

发布了140 篇原创文章 · 获赞 16 · 访问量 8686

猜你喜欢

转载自blog.csdn.net/Huwence/article/details/101637116