1. 程式人生 > >劍指offer:面試題57

劍指offer:面試題57

面試題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)