LeetCode刷题---876. 链表的中间结点(快慢指针)

简介: LeetCode刷题---876. 链表的中间结点(快慢指针)



一、编程题:876. 链表的中间结点

1.题目描述

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

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

2.示例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.

3.输出描述:

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

输出:此列表中的结点 4 (序列化形式:[4,5,6])

由于该列表有两个中间结点,值分别为 3 和 4,我们返回第二个结点。


二、解题思路

1.思路

解决方法1(个人想法):

  • Step1.利用while循环找到链表总长度length;
  • Step2.根据length可以找到链表中的中间位置,把该中间结点赋值给头结点即可;

解决方法2(快慢指针):

  • Step1.创建两个指针,慢指针用于指向当前位置,快指针用于指向当前的位置的下下一个位置;
  • Step2.当快指针为空,或者快指针的下一个指向为空时停止循环。

三、代码实现

这个代码是自己一步步试错试出来,整体代码逻辑上会有些冗余,不够简洁。每个代码块都写了注释,方便理解,代码还可以改进;

代码如下(示例):

解法一:

class Solution {
    public ListNode middleNode(ListNode head) {
        //第一种方法
        ListNode mid_head = head;
        int head_length = 0;
        int head_count = 0;
        while(head != null){
            head = head.next;
            head_length++;
        }
        head_count = (int)Math.ceil(head_length / 2);
        while((head_count--) > 0){
            mid_head = mid_head.next;
        }
        return mid_head;
    }
}

解法二:

class Solution {
    public ListNode middleNode(ListNode head) {
        //第二种方法
        ListNode slow = head;
        ListNode fast = head;
        while(fast != null && fast.next != null){
            slow = slow.next;
            fast = fast.next.next;
        }
        return slow;
    }
}

总结

以上就是今天要讲的内容,一开始做题的时候,由思路受限,只能想到先用循环来找到链表的长度,然后在根据其长度找到中间值,后面看了别人的解法之后,发现一个更有趣的解法(快慢指针),所以就赶紧记录一下这个方法,开阔一下思路。

感谢观看,如果有帮助到你,请给题解点个赞和收藏,让更多的人看到。🌹 🌹 🌹

也欢迎你,关注我。👍 👍 👍

原创不易,还希望各位大佬支持一下,你们的点赞、收藏和留言对我真的很重要!!!💕 💕 💕 最后,本文仍有许多不足之处,欢迎各位认真读完文章的小伙伴们随时私信交流、批评指正!


相关文章
|
8天前
刷题之Leetcode160题(超级详细)
刷题之Leetcode160题(超级详细)
11 0
|
8天前
刷题之Leetcode206题(超级详细)
刷题之Leetcode206题(超级详细)
21 0
刷题之Leetcode206题(超级详细)
|
8天前
|
索引
刷题之Leetcode707题(超级详细)
刷题之Leetcode707题(超级详细)
13 0
|
8天前
|
索引
刷题之Leetcode35题(超级详细)
刷题之Leetcode35题(超级详细)
13 0
|
1月前
|
算法
LeetCode刷题---19. 删除链表的倒数第 N 个结点(双指针-快慢指针)
LeetCode刷题---19. 删除链表的倒数第 N 个结点(双指针-快慢指针)
|
1月前
|
存储
LeetCode刷题---817. 链表组件(哈希表)
LeetCode刷题---817. 链表组件(哈希表)
|
1月前
|
存储 C语言 索引
环形链表、环形链表 II、有效的括号​​​​​​​【LeetCode刷题日志】
环形链表、环形链表 II、有效的括号​​​​​​​【LeetCode刷题日志】
【移除链表元素】LeetCode第203题讲解
【移除链表元素】LeetCode第203题讲解
|
1月前
|
算法 安全 数据处理
LeetCode刷题---707. 设计链表(双向链表-带头尾双结点)
LeetCode刷题---707. 设计链表(双向链表-带头尾双结点)
|
1月前
|
存储 算法
LeetCode刷题--- 61. 旋转链表(快慢指针+闭合为环)
LeetCode刷题--- 61. 旋转链表(快慢指针+闭合为环)

热门文章

最新文章