📜  数据结构 |链表 |问题 16(1)

📅  最后修改于: 2023-12-03 15:26:09.085000             🧑  作者: Mango

数据结构 | 链表 | 问题 16
问题描述

给定一个带有头结点 head 的非空单链表,返回链表的中间结点,如果有两个中间结点,则返回第二个中间结点。

示例
输入:[1, 2, 3, 4, 5]
输出:3

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

本问题可以使用快慢指针的方法解决。我们可以使用两个指针,一个快指针和一个慢指针。我们一开始将两个指针都指向链表的头结点,将快指针每次向前移动两个节点,将慢指针每次向前移动一个节点。当快指针到达链表的末尾时,慢指针将指向链表的中间节点。

代码实现

如下是Python语言实现本问题的代码:

class Solution:
    def middleNode(self, head: ListNode) -> ListNode:
        slow, fast = head, head
        while fast and fast.next:
            slow = slow.next
            fast = fast.next.next
        return slow

本代码使用了Python语言中的类来实现本问题,时间复杂度为 $O(n)$,空间复杂度为 $O(1)$。

总结

本问题十分适合使用快慢指针的方法解决,时间复杂度为 $O(n)$,空间复杂度为 $O(1)$。本问题在校招或者实习面试中较为常见,建议程序员掌握解决此类问题的思路和技巧,以提高自己的面试成功率。