python中处理链表时特别注意引用传递的问题

在解决剑指offer第57题删除已排序链表中重复结点时,遇到因引用传递导致的错误。首先,用字典统计链表结点值的频率,再遍历链表,若结点值频率为1,则创建新结点加入新链表。错误1:只处理了首次出现的单个结点;错误2:未遍历完整个链表,因为复制结点时实际上引用了同一地址。解决方法需理解Python中可变对象的深浅拷贝概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

刷题刷到剑指offer第57题(删除链表(已排序)中重复的结点)时,按照自己的思路做的,发现输出结果时出现过以下问题:

做题思路:链表相当于一个前后有关系的数组,于是先把此题当做删除数组中重复的元素来思考,立马想到可以借用python中的字典来统计每个数字出现的频数(这样遍历一次的时间复杂度为O(n)),然后在通过遍历数组,通过判断该数字是否只出现一次,如果只出现一次则把它放进新的数组中,这样就把数组中重复的元素删除了(空间复杂度为O(n))。因此这道题也借用这种思路做。

步骤:(1)遍历一次链表,统计每个结点的值出现的频数;

         (2)遍历一次链表,如果结点值的频数为1,那么创建一个新结点,并与已有结点相连(如果是头结点,则直接创建)。


遇到的问题:

(1)测试实例为{1,1,2,3,4,4,5,5},输出为{2,3,4,4,5,5}。错误原因:对于只出现一次的结点,采用直接复制,导致后面重复的结点没有做处理。




(2)测试实例为{1,1,2,3,4,4,5,6},输出为{2,3}。错误原因:由于第一个错误是没有对只出现一次的结点后面重复的结点做处理,于是就直接在只出现一次的结点后面直接加了一条语句,这导致步骤二还没有遍历完链表就直接退出了。出现这个错误的原因是在python中,对于可变对象,直接复制意味着两个变量引用指向同一个地址,只要内容改变,两个变量引用的值都发生变化。





注意:由于这道题链表是有序的,所以肯定有更简便的方法。假如这道题的链表是无序时,也可以按照这个思路做。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值