剑指offer刷题笔记56(python)
题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
思路1
利用递归,如果当前节点是重复节点时,越过与当前节点相同的节点,找到第一个与当前节点的值不相同的节点,从第一个与当前结点不同的结点开始递归(重复的节点一个都不留)。如果当前节点不是重复节点,保留当前节点,从下一个节点开始递归。
代码1
class Solution:
def deleteDuplication(self
, pHead
):
if pHead
== None:
return None
if pHead
.next == None:
return pHead
if pHead
.val
!= pHead
.next.val
:
pHead
.next = self
.deleteDuplication
(pHead
.next)
return pHead
else:
tempNode
= pHead
while tempNode
and tempNode
.val
== pHead
.val
:
tempNode
= tempNode
.next
return self
.deleteDuplication
(tempNode
)
思路2
不用递归,用循环,当碰见一个重复的节点是,通过循环找到第一个不同的节点,这时需要一个记录当前节点之前情况的指针。
代码2
class Solution:
def deleteDuplication(self
, pHead
):
first
= ListNode
(-1)
first
.next = pHead
curr
= pHead
pre
= first
while curr
and curr
.next:
if curr
.val
!= curr
.next.val
:
curr
= curr
.next
pre
= pre
.next
else:
val
= curr
.val
while curr
and curr
.val
== val
:
curr
= curr
.next
pre
.next = curr
return first
.next