Leetcode #82. Remove Duplicates from Sorted List II

##题目
Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.

Example 1:

Input: 1->2->3->3->4->4->5
Output: 1->2->5
Example 2:

Input: 1->1->1->2->3
Output: 2->3

##题意
给出一个链表式的列表(只可以访问当前值和得到下一个节点,不能由当前节点往前遍历上一个节点),将出现重复的列表元素删除,

##想法
这道题乍一看和前面的删除有序链表元素类似,但事实上是会复杂一些的,主要原因就在于如何判断该元素是否能删除,最简单的想法就是用一个变量存上一个节点,然后判断时就看当前节点的上一个节点和下一个节点的值是否与当前节点的值一致,需要考虑的是可能是链表开头和链表结尾。还有一点需要注意的便是如何初始化链表头,因为不同于只删除重复元素的多余元素,它是会至少留一个的,比如1->1->2会处理成1->2,如果你设置链表头为第一个元素是可行的,但在这道题是不保留会重复元素,就是1->1->2会处理成2,这样就不能直接初始化链表头了,所以需要一个额外变量去存第一个有效节点为链表头。还有的便是你需要存一个新链表的最后节点,不过这个是一个很自然的想法。
所以就需要三个额外变量,一个存新链表头的节点,一个存新链表的最后有效节点,一个存当前遍历节点的上一个节点。

##实现

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def deleteDuplicates(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        begin = None
        last = None
        valid = None
        current = head
        while current:
            if (last==None or last.val!=current.val) and (current.next==None or current.val!=current.next.val):
                if begin==None:
                    begin=current
                else:
                    valid.next = current
                valid=current    
            last = current
            current = current.next
        if valid!=None:
            valid.next=None
        return begin
            
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值