Python中链表与数组赋值的差异及链表尾插代码的逻辑困惑
Python中链表与数组赋值的差异及链表尾插代码的逻辑困惑
嘿,我完全懂你这种困惑的感觉!咱们一点点拆解清楚这个问题:
首先先看你举的数组例子:
a = [1,2,3,4,5,6] b = a for i in range(5): b.append(i)
这里b = a是让变量b和a指向同一个数组对象。数组是可变容器,当你用b.append()的时候,你是在修改这个共享的数组对象本身,所以a和b作为这个对象的两个引用,自然都会看到变化。
接下来回到链表的代码,咱们一步步看逻辑:
def insertNodeAtTail(head, data): if head is None: head = SinglyLinkedListNode(data) return head current_head = head while current_head.next: current_head = current_head.next current_head.next = SinglyLinkedListNode(data) return head
这里的关键是要区分修改引用指向和修改对象属性:
- 一开始
current_head = head,确实是让current_head和head指向同一个头节点对象。 - 但进入循环后,
current_head = current_head.next这一步,是把current_head的引用切换到了下一个节点,而不是修改原来的节点!这时候head还是稳稳指向最初的头节点,完全没动。 - 当循环结束时,
current_head已经指向了链表的最后一个节点,这时候current_head.next = SinglyLinkedListNode(data)是修改最后一个节点的next属性,把新节点挂到链表末尾——这一步是在修改节点对象的内容,而不是改变head或者current_head的引用指向。
所以整个过程中,head始终指向链表的第一个节点,返回它自然符合题目要求;而如果返回current_head,你返回的是刚插入的最后一个节点,不是头节点,结果当然错了。
简单总结一下:
- 数组的赋值是让两个变量共享同一个容器对象,修改容器内容会影响所有引用。
- 链表的遍历中,
current_head只是一个“移动的指针”,它的引用不断切换节点,但head的引用固定在头节点,我们修改的是节点的属性,不是head的指向。
这样是不是就清晰多啦?
备注:内容来源于stack exchange,提问作者gradstudent1995
相关产品推荐
相关产品推荐

