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
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值