python中处理链表时特别注意引用传递的问题
刷题刷到剑指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中,对于可变对象,直接复制意味着两个变量引用指向同一个地址,只要内容改变,两个变量引用的值都发生变化。
注意:由于这道题链表是有序的,所以肯定有更简便的方法。假如这道题的链表是无序时,也可以按照这个思路做。