剑指offer——删除链表中重复的结点(Python编译+测试+详解)

题目要求:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5

 

# -*- coding: utf-8 -*-


class ListNode:
     def __init__(self, x):
         self.val = x
         self.next = None


class LinkList:
    """
   创建一个链表类,链表由结点构成
    """
    def __init__(self):
        self.head = ListNode(0)  # 创建一个带头结点(随便赋值,哑结点)的单链表
 
    def InitList(self, data):
        if len(data) == 0:
            print('\nIt is a empty link list!')
            return False
        self.head.next = ListNode(data[0])  # 实例化结点,并将data[0]赋给头结点后第一个结点
        p = self.head.next  # 指针指向头结点后第一个结点
 
        for i in data[1:]:  # 将data中的其它数塞进链表
            p.next = ListNode(i)  # p.next原本是空的,担当被赋值时p.next就不为空
            p = p.next  # 同时也保证最后一个节点的next为空
 
    def PrintList(self,p):  # 打印链表
        while p:
            print(p.val, end=' ')
            p = p.next

#主体部分
class Solution:
    def deleteDuplication(self, pHead):#根据题目要求无头结点,返回pHead为头指针,pHead含有第一个数
        # write code here
        if (not pHead)or(not pHead.next):
            return pHead
        pPrev = None#定义一个空结点,一直跟着pNode,pPrev起往前都是不重复的结点
        pNode = pHead
        while pNode:#从第一个数开始循环
            needToBeDel = False#是否删除判断标志
            if pNode.next and pNode.val == pNode.next.val:
                needToBeDel = True
            if needToBeDel == False:
                pPrev = pNode
                pNode = pNode.next
            else:
                value = pNode.val
                while pNode and pNode.val == value:#从该结点起往后删除与之数值相同的所有点
                    pToBeDel = pNode#复制结点位置
                    del pToBeDel#删除该结点
                    pNode = pNode.next#跳到下一个节点
                if pPrev == None:
                    pHead = pNode
                else:
                    pPrev.next = pNode
        return pHead

#测试部分
def main():
    """
    测试
    """
    temp = input("Input a list: ")  # 输入数据
    data = temp  # 将数据存储在data中
    lst = LinkList()  # 创建/实例化单链表
    lst.InitList(data)  # 将data填入链表
    print("before: ")
    lst.PrintList(lst.head.next)  # 打印链表
    print("\nafter:")
    solution = Solution()
    solution.deleteDuplication(lst.head.next)
    lst.PrintList(lst.head.next)
 
 
main()

测试结果:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值