LeetCode有序链表去重:head指针及返回逻辑的疑惑
有序链表去重问题的指针疑惑解答
问题背景
刚完成数据结构与算法在线课程,开始刷LeetCode的有序链表去重问题,题目输入为有序链表的head,要求移除所有重复节点并返回新链表。附上示例解法代码:
# Definition for singly-linked list. # class ListNode: # def __init__(self, val=0, next=None): # self.val = val # self.next = next class Solution: def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]: if head is None: return head pt=head prev=pt pt=pt.next while pt: if pt.val==prev.val: # 如果两个节点值相同,prev.next跳过当前pt,直接指向pt的下一个节点 prev.next=pt.next pt=pt.next else: prev=pt pt=pt.next return head
疑惑解答
关于head的含义与直接return head的现象
head就是指向链表首节点的指针,它本身不会自动遍历。你写return head的错误解法输出和输入一致,是因为你完全没修改链表的结构——链表的节点是靠next指针串联的,你没改动任何节点的next指向,所以整个链表和输入完全一样。而LeetCode判题时会自动从head开始遍历整个链表来输出结果,这是判题逻辑做的事,不是head自己会遍历。为什么修改prev指针后return head就能得到去重链表
链表是引用类型,head、prev、pt这些指针都是指向链表节点的引用。你操作prev时,修改的是prev.next的指向:比如当发现pt和prev值重复时,把prev.next改成pt.next,这直接修改了原链表的节点连接关系——原本prev指向pt,现在跳过pt直接指向pt的下一个节点,pt这个重复节点就被从链表的链路上剔除了。
而head始终指向原链表的首节点(这道题里有序链表的首节点不可能被删除,因为没有比它更早的重复节点),所以从head开始遍历,就能得到修改后的去重链表——整个过程都是在原链表基础上修改节点间的连接,没有新建链表,最后返回的head还是指向首节点,但后面的节点连接已经被prev的操作修正好了。
内容的提问来源于stack exchange,提问作者Dommy1
相关产品推荐
相关产品推荐

