18.删除链表中重复的结点

题目描述

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

思路:一道看似简单却花了我不少时间的题...窒息,什么时候用多个指针呢。果然在提交代码前还是应该先自己多考虑几种测试用例测测,不要盲目提交。这道题是要把排序链表中值重复的节点去除掉,把重复的节点前后那些没有重复的节点连接起来。比较到当前位置时,上一个没有重复的节点和第一个跳出重复的节点都需要被记录下来以进行连接,比如说ABCCDEF,就需要把B和D记录下来。从前往后逐节点进行遍历,只要前后两个节点的值不同,那么可以保证的是前一个节点肯定是没有重复的,用tmp来存储它,因此在遍历链表的过程中tmp总是存储着当前位置以前最后一个肯定没有重复的节点。使用Flag为True表示当前节点是重复的节点,下一次比较如果两个节点不等并且Flag为True那么说明后一个节点是跳出来的第一个不相等的节点(该节点可能有重复节点,也可能没有)。如果节点jump是从重复节点中跳出来的第一个节点,那么说明tmp和jump之间的节点可以移除,tmp和jump连接,再将Flag变成False说明这次跳出来的节点处理完了。接下来从jump和jump.next接着进行判断是否重复。当遍历完一遍链表,即pHead.next为空时,就可以跳出循环了。

需要特别考虑的是,如果链表为空,直接返回空;如果链表所有节点都重复,那么也返回空。链表全部重复,意味着并没有从重复中跳出来,所以Flag将一直为True,根据Flag进行返回就好。

pre是设置的一个空节点,它的下一个节点是头节点。不把pre赋值为头节点是为了避免头节点就是重复的节点。返回新的链表时,头节点应该为pre.next。tmp需要先赋值,否则可能出现tmp.next在tmp赋值前调用的情况。

python题解:

# -*- coding:utf-8 -*-
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
class Solution:
    def deleteDuplication(self, pHead):
        # write code here
        if not pHead:
            return None
        pre=ListNode(None)
        tmp=pre
        pre.next=pHead
        Flag=False
        while pHead and pHead.next:
            if pHead.val!=pHead.next.val:
                if Flag==True:
                    tmp.next=pHead.next
                    pHead.next=None
                    pHead=tmp.next
                    Flag=False
                else:
                    tmp=pHead
                    pHead=pHead.next
            else:
                Flag=True
                pHead=pHead.next
        if Flag:
            tmp.next=None
        return pre.next

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值