题目:
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
示例 1:
输入: 1->2->3->3->4->4->5 输出: 1->2->5
示例 2:
输入: 1->1->1->2->3 输出: 2->3
# 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
"""
#如果头结点为空 或者链表长度为1 则返回头结点
if head is None or head.next is None:
return head
first=ListNode(0)
first.next=head
res=head
#定义要进行比较的节点前面的指针,若进行比较的节点有重复,则直接将res_start指向不重复的下一节点即(res_end.next)
res_start=first;
#定义下一节点的最后一个重复的节点
res_end=res;
#重复标志位
flag=0;
while res and res.next:
#如果当前节点与下一节点重复,则将重复标志置1,并向后移动res_end节点和res节点
if res.val ==res.next.val:
flag=1
res_end=res.next
res=res.next;
#如果当前节点与下一节点不相等,且当前节点有过重复
elif res.val !=res.next.val and flag==1:
flag=0
#删去重复的节点
res_start.next=res_end.next;
#移动res_end到下一不相等的节点
res_end=res_start.next;
res=res_end
else:
#如果当前节点没有发生过重复,则仅简单将节点往后移动
res_start=res;
res_end=res.next;
res=res.next
#如果最后的两个及以上节点发生重复,则直接将res_start指向None
if flag==1:
res_start.next=None;
return first.next