題目描述
在一個排序的鏈表中,存在重複的結點,請刪除該鏈表中重複的結點,重複的結點不保留,返回鏈表頭指針。 例如,鏈表1->2->3->3->4->4->5 處理後爲 1->2->5
思路:一道看似簡單卻花了我不少時間的題...窒息,什麼時候用多個指針呢。果然在提交代碼前還是應該先自己多考慮幾種測試用例測測,不要盲目提交。這道題是要把排序鏈表中值重複的節點去除掉,把重複的節點前後那些沒有重複的節點連接起來。比較到當前位置時,上一個沒有重複的節點和第一個跳出重複的節點都需要被記錄下來以進行連接,比如說ABCCDEF,就需要把B和D記錄下來。從前往後逐節點進行遍歷,只要前後兩個節點的值不同,那麼可以保證的是前一個節點肯定是沒有重複的,用tmp來存儲它,因此在遍歷鏈表的過程中tmp總是存儲着當前位置以前最後一個肯定沒有重複的節點。使用Flag爲True表示當前節點是重複的節點,下一次比較如果兩個節點不等並且Flag爲True那麼說明後一個節點是跳出來的第一個不相等的節點(該節點可能有重複節點,也可能沒有)。如果節點jump是從重複節點中跳出來的第一個節點,那麼說明tmp和jump之間的節點可以移除,tmp和jump連接,再將Flag變成False說明這次跳出來的節點處理完了。接下來從jump和jump.next接着進行判斷是否重複。當遍歷完一遍鏈表,即pHead.next爲空時,就可以跳出循環了。
需要特別考慮的是,如果鏈表爲空,直接返回空;如果鏈表所有節點都重複,那麼也返回空。鏈表全部重複,意味着並沒有從重複中跳出來,所以Flag將一直爲True,根據Flag進行返回就好。
pre是設置的一個空節點,它的下一個節點是頭節點。不把pre賦值爲頭節點是爲了避免頭節點就是重複的節點。返回新的鏈表時,頭節點應該爲pre.next。tmp需要先賦值,否則可能出現tmp.next在tmp賦值前調用的情況。
python題解:
# -*- coding:utf-8 -*-
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def deleteDuplication(self, pHead):
# write code here
if not pHead:
return None
pre=ListNode(None)
tmp=pre
pre.next=pHead
Flag=False
while pHead and pHead.next:
if pHead.val!=pHead.next.val:
if Flag==True:
tmp.next=pHead.next
pHead.next=None
pHead=tmp.next
Flag=False
else:
tmp=pHead
pHead=pHead.next
else:
Flag=True
pHead=pHead.next
if Flag:
tmp.next=None
return pre.next