链表的中间结点

107 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

链表的中间结点

题目

给定一个头结点为 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.

示例 2:

输入: [1,2,3,4,5,6] **输出:**此列表中的结点 4 (序列化形式:[4,5,6]) 由于该列表有两个中间结点,值分别为 3 和 4,我们返回第二个结点。

提示:

  • 给定链表的结点数介于 1100 之间。

题目分析

这道题呢主要考察的是链表的遍历,有一种思路是先遍历一次然后得到链表的长度,然后再从头遍历根据链表长度找到中间位置的节点,这是一种解决方法,但如果链表太长的话,效率显然也会下降,这里我们采用比较高效的一种方法,那就是快慢指针。

代码实现

这是代码的实现:

/**
 * 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) {
        if (head == null) {
            return null;
        }
        ListNode slow = head;
        ListNode fast = head;
        while (fast != null && fast.next != null) {
            slow = slow.next;
            fast = fast.next.next;
        }
        return slow;
    }
}

这是我用java实现的功能,每个题都用不同的解法和写法,我大体整理了一下自己的思路然后就写了,也没有再想其他的方法,如果你有更好的解法,欢迎和我留言,我们一起进步,一起学习数据结构,共同进步,通过这道题能更熟悉链表的遍历和快慢指针的使用和操作。

快慢指针顾名思义就是有一个指针走的快,有一个指针走的慢,这里的代码中,快指针走两个node节点,慢指针走一个node节点,当快指针走到尾部的时候,慢指针正好走到链表的中间节点,可以说非常的巧妙,理解了这个思路之后,代码也变得十分的简单,短短几行代码就解决了我们的问题。

总结

本篇文章主要介绍了链表的遍历和使用快慢指针来解决求链表中间节点的问题,快慢指针是解决这类问题比较巧妙的一种方法,题目有不同的解法,我说的第一种方法你能用代码实现出来吗,希望感兴趣的小伙伴们自己实现一下吧,嘿嘿,多动脑,勤思考。