python链表——删除链表重复项

输入:1->2->1->4->4->5

输出:1->2->4->5

顺序删除

思路:

1. 采用双重while循环来遍历,遇到重复的就删除

2. 删除操作是用前一个节点pre的指针指向当前节点cur的下一个节点, 即pre.next = cur.next

3. 我们引入三个操作节点的指针outCur, innerCur, innerPre,代表外层当前节点,内层当前节点,内层节点的前一个节点

4. 引入的外部操作指针,需要进行初始化,outCur = head, innerCur = head.next, innerPre = outCur

5. 如果outCur.data == innerCur.data,说明重复,则进行删除操作

6. 操作指针的移动: outCur = outCur.next, pre = innerCur, innerCur = innerCur.next

7. 特殊情况:头节点为空,或者为单节点,直接返回

代码

def removeDup(head):
    if head is None or head.next is None:
        return head
    # 外部操作节点outCur的初始化,头节点作为第一个要遍历的节点
    outCur = head
    while outCur:
        # 内部操作节点innerCur的初始化,第二个节点作为与头节点的比较节点
        innerCur = outCur.next
        # 由于删除节点时,需要前一个节点指针指向下一个节点,故初始化pre节点,为内部节点innerCur前一个节点outCur
        innerPre = outCur
        while innerCur:
            # 找到重复,前一个节点指针innerPre.next指向下一个节点innerCur.next, 操作指针innerCur移动到下一个节点
            if outCur.data == innerCur.data:
                innerPre.next = innerCur.next
                innerCur = innerCur.next
            else:
                # 没找到重复,innerCur给innerPre, innerCur移到到下一个节点inner.next
                innerPre= innerCur
                innerCur = innerCur.next
        # 移动w外部操作指针outCur到下一个节点OutCur.next
        outCur = outCur.next
    return head
# 测试
link = LinkedList()
print("============= before =============")
link.add(1)
link.add(2)
link.add(1)
link.add(4)
link.add(4)
link.add(5)
link.print_link()
print("============= after =============")
removeDup(link.head)
link.print_link()
# 结果
============= before =============
1
2
1
4
4
5
============= after =============
1
2
4
5

评价:双重循环,时间复杂度为O(N),引入的常数个操作节点指针,空间复杂度为O(1)

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中,可以使用类来实现链表。一个常见的链表实现是单链表。单链表由节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。在Python中,可以使用类来定义单链表。例如,可以定义一个SingleLinkedList类,其中包含一个头节点和链表的大小属性。可以使用__init__方法来初始化链表为空表,并使用其他方法来实现链表的各种操作,如插入、删除和遍历等。\[1\] 在Python中,变量赋值是指针的赋值运算。当使用a,b=b,a这样的赋值语句时,实际上是将a和b的指针进行了交换,而不是交换它们所指向的对象的值。这是因为在Python中,一切皆为对象,变量存储的是对象的地址。因此,通过交换指针,可以实现变量值的交换。这种机制使得在Python中进行链表操作更加方便,可以直接通过改变节点的指针来实现节点之间的连接。\[2\]\[3\] 所以,在Python中实现链表时,可以使用类来定义节点,每个节点包含一个数据元素和一个指向下一个节点的指针。通过改变节点的指针,可以实现节点之间的连接,从而构建链表。可以使用类的方法来实现链表的各种操作,如插入、删除和遍历等。 #### 引用[.reference_title] - *1* [Python数据结构——链表的实现](https://blog.csdn.net/weixin_33772645/article/details/86193584)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Python实现链表](https://blog.csdn.net/qq_38851184/article/details/105750984)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值