##题目
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