题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
python实现:
# -*- coding:utf-8 -*-
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def deleteDuplication2(self, pHead):
# write code here
if pHead is None:
return None
#先看头结点是否有重复
p = pHead
isDuplicated = False
while p and p.next:
if p.val==p.next.val:
isDuplicated = True
p = p.next
else:
if isDuplicated:
pHead = p.next
p = pHead
isDuplicated=False
else:
break
if isDuplicated:
pHead = p.next
if pHead is None:
return None
p = pHead.next
pre = pHead
isDuplicated = False
while p and p.next:
if p.val == p.next.val:
isDuplicated = True
p = p.next
else:
if isDuplicated:
pre.next = p.next
isDuplicated = False
else:
pre.next = p
pre = p
p = p.next
if isDuplicated:
pre.next = p.next
return pHead
# 写法2:
def deleteDuplication(self, pHead):
# write code here
if pHead is None or pHead.next is None:
return pHead
# 注意:当头结点后面有重复时
while pHead and pHead.next:
if pHead.val != pHead.next.val:
break
# else
p = pHead.next
while p and p.val==pHead.val:
p = p.next
pHead = p
if pHead is None or pHead.next is None:
return pHead
pre, p = pHead, pHead.next # pre是p的前驱结点
while p:
if p.next:
if p.next.val != p.val:
pre = p
p = p.next
else:
q = p.next.next
while q and q.val == p.val:
q = q.next
pre.next = q
p = q
else:
break
return pHead
# 写法3:剑指书上的写法:
def deleteDuplication(self, pHead):
# write code here
if pHead is None or pHead.next is None:
return pHead
pre, p = None, pHead # pre是p的前驱结点
while p:
q = p.next
is_duplicate = False
if q and q.val==p.val:
is_duplicate = True
if not is_duplicate:
pre = p
p = q
else:
value = p.val
while q and q.val==value:
q = q.next
if pre is None:
pHead = q
else:
pre.next = q
p = q
return pHead