链表去重:两段Python代码为何一段有效一段无效?
链表去重代码的疑问解析
第一段代码为何能正常运行?
class LinkedList: def __init__(self, value): self.value = value self.next = None def removeDuplicatesFromLinkedList(linkedList): cur = linkedList while cur.next is not None: if cur.value == cur.next.value: cur.next = cur.next.next else: cur = cur.next return linkedList
这段代码里,cur只是指向原链表头节点的引用变量,遍历过程中我们修改的是cur.next——也就是节点对象的next属性,这直接改动了原链表的结构。而函数参数linkedList自始至终都指向原链表的头节点,所以最后返回它,得到的就是已经完成去重的完整链表。
简单说:我们没动linkedList指向的头节点,只是通过cur遍历修改了链表内部的指针关系,原链表的头节点位置没变,返回它自然能拿到整个修改后的链表。
第二段代码为何失效?
class LinkedList: def __init__(self, value): self.value = value self.next = None def removeDuplicatesFromLinkedList(linkedList): while linkedList.next is not None: if linkedList.value == linkedList.next.value: linkedList.next = linkedList.next.next else: linkedList = linkedList.next return linkedList
这段代码的问题在于,直接把参数linkedList当成了遍历指针。遍历过程中,当遇到不同值的节点时,linkedList = linkedList.next会让这个变量指向链表的下一个节点,最后遍历结束时,linkedList已经指向了链表的末尾节点(而非原头节点)。此时返回它,只能得到链表的最后一部分,而非完整的去重链表。
比如原链表是1->1->2->2->3,遍历结束后linkedList会指向3,返回的就只有3,前面的节点都丢失了,自然无法实现预期的去重效果。
内容的提问来源于stack exchange,提问作者NessunDorma
相关产品推荐
相关产品推荐

