劍指offer:面試題57
阿新 • • 發佈:2018-12-12
面試題57:刪除連結串列中重複的結點:我們需要設定一個指標preNode,preNode最開始為None,然後設定兩個指標,pNode指向當前節點,pNext指向pNode下一個結點:
如果pNext不為空而且pNext的值等於pNode的值,那麼就說明出現了重複數字的結點,就需要刪除,然後從pNode開始遍歷,如果結點值等於前面那個重複值,繼續遍歷。當遍歷到None或者不同值結點的時候,這時候需要判斷preNode結點,如果preNode結點為None,就說明我們剛才的重複結點是從整個連結串列的頭結點開始重複的,就直接把pHead設定為當前結點,pNode也設定為當前結點。反之,如果preNode不為None,直接把preNode的下一個指標指向當前節點,pNode指向preNode即可;⓶如果pNext為空或者pNext的值不等於pNode的值,說明當前的這個pNode和後面的值不重複,直接令preNode = pNode,pNode指向下一個結點即可。
''' 刪除連結串列中重複的結點 在一個排序的連結串列中,存在重複的結點,請刪除該連結串列中重複的結點,重複的結點不保留,返回連結串列頭指標。 例如,連結串列1->2->3->3->4->4->5 處理後為 1->2->5 ''' class ListNode: def __init__(self, x): self.val = x self.next = None class Solution: def deleteDuplication(self, pHead): if pHead == None: return preHead = None pNode = pHead while pNode != None: needDelete = False nextNode = pNode.next if nextNode != None and nextNode.val == pNode.val: needDelete = True if needDelete == False: preHead = pNode pNode = pNode.next else: nodeVal = pNode.val pToBeDel = pNode while pToBeDel != None and pToBeDel.val == nodeVal: pToBeDel = pToBeDel.next if preHead == None: pHead = pToBeDel pNode = pToBeDel continue else: preHead.next = pToBeDel pNode = preHead return pHead node1 = ListNode(1) node2 = ListNode(2) node3 = ListNode(3) node4 = ListNode(3) node5 = ListNode(4) node6 = ListNode(4) node7 = ListNode(5) node1.next = node2 node2.next = node3 node3.next = node4 node4.next = node5 node5.next = node6 node6.next = node7 s = Solution() print(s.deleteDuplication(node1).val)