You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

链表指针概念困惑:自定义单链表middle方法逻辑疑问

关于单链表middle方法的逻辑解惑

先把你的代码补全必要依赖后整理如下:

import math
from typing import Optional

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

class SinglyLinkedList:
    def __init__(self):
        self.head = None
        self.tail = None

    def __len__(self):
        size, temp = 0, self.head
        while temp:
            temp = temp.next
            size += 1
        return size

    def middle(self) -> Optional[ListNode]:
        temp, newList = self.head, ListNode('whatever lmao')
        current = newList
        size = len(self)
        for i in range(size):
            if i >= math.floor(size/2):
                current.next = temp 
                current = current.next
            temp = temp.next
        return newList.next

接下来逐个解答你的困惑:

1. current = newList的本质是什么?

Python里没有“复制类”或“指针”的概念,这是对象引用的赋值:

  • newList变量存储的是ListNode('whatever lmao')这个对象在内存中的引用(可以理解为对象的内存地址)。
  • 执行current = newList后,current也会存储同一个对象的引用——也就是说,初始状态下current和newList指向的是同一个ListNode对象。

2. 为什么newList和current能形成链表,修改current却不影响newList?

分两个阶段看:

  • 修改current.next的阶段:
    当你执行current.next = temp时,是在修改current指向的那个ListNode对象的next属性——而这个对象正是newList指向的对象,所以newList.next也会同步变化。
  • current = current.next的阶段:
    这一步是把current的引用改成current.next指向的新节点(原链表的中间节点)。此时current和newList指向的不再是同一个对象:newList始终指向最初创建的临时节点,current则顺着链表往后移动。后续对current的修改只会影响当前节点,不会改变newList指向的头节点。

你最终返回的newList.next,就是这个临时节点的下一个节点——也就是原链表中间节点开始的子链表。

3. 将ListNode赋值给匿名变量时会发生什么?

如果创建ListNode对象但不赋值给任何变量(比如直接写ListNode('test')),这个对象会被Python标记为“无引用”,很快会被垃圾回收机制销毁,释放内存。

在你的代码里,ListNode('whatever lmao')被赋值给了newList,有引用指向它,所以不会被回收;直到middle方法执行完毕,newList等局部变量被销毁后,才会被回收(如果返回的newList.next没有被外部引用的话)。


内容的提问来源于stack exchange,提问作者Rick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 00:57:13