Python链表删除非首尾节点时两种写法的差异及生效原因咨询
两种写法的核心差异与原理
两种写法的本质区别是修改的对象完全不同:
node = node.next修改的是临时引用变量node的指向,没有改动链表本身的结构node.next = node.next.next修改的是node指向的链表节点的next属性,直接改动了链表的节点关联关系
为什么第一种写法无法删除节点
Python里的变量本质是对内存对象的引用,你声明的node只是一个临时用来访问、操作链表节点的「指针标签」:
你执行node = node.next的时候,只是把贴在原节点上的node标签撕下来,贴到了下一个节点上,链表中所有节点的关联关系没有发生任何变化,当然不可能实现删除节点的效果。
举个实际的例子:假设现在链表结构是节点A → 节点B → 节点C → 节点D,你要删除节点B,此时node变量正指向节点A:
- 执行
node = node.next后,node变量现在指向节点B,链表还是A→B→C→D,没有任何改动 - 执行
node.next = node.next.next后,节点A的next属性从指向节点B改成了指向节点C,链表变成A→C→D,节点B就被成功从链表中移除了。
如果你的需求是删除node当前指向的非首尾节点,第一种写法更是完全不相关,正确的删除当前节点的写法是先覆盖值再改next:
node.val = node.next.val node.next = node.next.next
内容的提问来源于stack exchange,提问作者Henry N.
相关产品推荐
相关产品推荐

