链表中间节点

题目:给你单链表的头结点 head ,请你找出并返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。

示例 1:

在这里插入图片描述

输入:head = [1,2,3,4,5]
输出:[3,4,5]
解释:链表只有一个中间结点,值为 3 。

示例 2:
在这里插入图片描述

输入:head = [1,2,3,4,5,6]
输出:[4,5,6]
解释:该链表有两个中间结点,值分别为 3 和 4 ,返回第二个结点。

解题采用快慢指针

python解法


```python
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def middleNode(self, head: Optional[ListNode]) -> Optional[ListNode]:
        fast=slow=head
        while fast and fast.next:
            fast=fast.next.next
            slow=slow.next
        return slow

c++解法

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;
    }
};


### 找到单向链表中间节点的算法实现 要找到单向链表中间节点,可以使用双指针技术。该方法的核心思想是定义两个指针 `slow` 和 `fast`,初始时均指向链表头部。在遍历过程中,`fast` 指针每次向前移动两步,而 `slow` 指针每次仅前进一步。当 `fast` 到达链表末尾时,`slow` 将正好位于链表的中间位置[^1]。 以下是基于此逻辑的具体代码实现: ```java public class ListNode { int val; ListNode next; public ListNode(int val) { this.val = val; this.next = null; } } public class MiddleNodeFinder { public static ListNode findMiddle(ListNode head) { if (head == null || head.next == null) { return head; // 链表为空或者只有一个节点的情况 } ListNode slow = head, fast = head; while (fast != null && fast.next != null) { // 循环条件确保不会越界 slow = slow.next; // 慢指针每次前进一步 fast = fast.next.next; // 快指针每次前进两步 } return slow; // 当快指针到达终点时,慢指针即为中间节点 } public static void main(String[] args) { // 构建一个简单的链表:1 -> 2 -> 3 -> 4 -> 5 ListNode head = new ListNode(1); head.next = new ListNode(2); head.next.next = new ListNode(3); head.next.next.next = new ListNode(4); head.next.next.next.next = new ListNode(5); ListNode middle = findMiddle(head); // 调用函数寻找中间节点 System.out.println("中间节点的值:" + middle.val); // 输出应为 3 } } ``` #### 关键点解释 - **时间复杂度**:由于 `fast` 每次跳跃两次,`slow` 只需遍历一半的链表即可完成操作,整体的时间复杂度为 O(n)[^1]。 - **空间复杂度**:除了原链表外未引入其他辅助存储结构,因此空间复杂度为 O(1)[^1]。 - 对于偶数长度的链表,最终返回的结果将是中间两个节点中的第一个节点[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值