剑指offer实践 ——18.2.删除链表中重复的节点(python版)



题目

删除链表中重复的节点
在这里插入图片描述
a) 1->2->3->3->4->4->5
b)1->2->5


一、思路一

使用两个指针。如果第一个指针和第二个指针内容相同,则需要删除这两个节点。
在这里插入图片描述
可以将p2的下一个节点的内容复制给p1,再另p1指向p2的下一个节点,等同与删除了当前的p1和p2节点~这种处理方式在处理头节点和第二个节点内容重复时,不需要新建一个头节点~
但是这种方式的问题在于,如果尾部的两个节点相同,则没办法回溯到上一个不重复的节点令它指向None。

def delete_duplication(head):
    p1 = head
    p2 = head.next

    while p2:
        if p1.var == p2.var:
            if p2.next:
                p1.var = p2.next.var
                p1.next = p2.next.next
                p2 = p1.next
            else:
                p1.var = None
                p1.next = None
                p2 = None
        else:
            p1 = p1.next
            p2 = p1.next

二、思路二

思路一提供的方式存在尾节点重复无法删除的问题,增加一个指针,保存上一个节点则能处理这种情况。

def delete_duplication_2(head):
    p1 = head
    p2 = head.next
    p3 = head

    while p2:
        print(p1.var, p2.var)
        if p1.var == p2.var:
            if p2.next:
                p1.var = p2.next.var
                p1.next = p2.next.next
                p2 = p1.next
                if p1 != head:
                    p3 = p3.next
            else:
                p3.next = None
                p2 = None
        else:
            p1 = p1.next
            p2 = p1.next

以上两种思路都不能处理,全部都是重复元素的链表。有待思考改进~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值