1. 程式人生 > >劍指offer——在一個排序的連結串列中,存在重複的結點,請刪除該連結串列中重複的結點, # 重複的結點不保留,返回連結串列頭指標。

劍指offer——在一個排序的連結串列中,存在重複的結點,請刪除該連結串列中重複的結點, # 重複的結點不保留,返回連結串列頭指標。

# 在一個排序的連結串列中,存在重複的結點,請刪除該連結串列中重複的結點,
# 重複的結點不保留,返回連結串列頭指標。 例如,連結串列1->2->3->3->4->4->5 處理後為 1->2->5
# -*- coding:utf-8 -*-
class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None
class Solution:
    # 需要注意的是,最後一個節點,它的next為空,因此最後的重複節點集合為None,上一個節點(不重複)加入了nodes,不重複直接刪掉
    def deleteDuplication(self, pHead):
        node_list = [] #儲存相同的節點
        nodes = [] #儲存不重複的節點
        p = pHead
        node_list = [p]
        while p != None:
            p1 = p.next
            if p1 != None and p1.val == p.val:
                node_list.append(p1) # 當前後節點相等,將後一個節點新增到重複節點集合中
            if p1 == None or p1.val != p.val:
                if len(node_list) == 1:
                    nodes.append(p) # 當前前後節點不同,看看前一個節點的重複節點集合中有幾個元素,如果只有一個,認為前一個節點為有效節點
                node_list = [p1] #將後一個節點作為重複節點集合的初始值
            p = p1
        if len(nodes) == 0:
            return None
        nodes.append(None)
        for k in range(len(nodes)-1):
            nodes[k].next = nodes[k+1]
        return nodes[0]
a1=ListNode(1)
a2=ListNode(2)
a3=ListNode(3)
a4=ListNode(4)
a5=ListNode(5)
a1.next=a2
a2.next=a3
a3.next=a4
a4.next=a5       
S = Solution()
S.deleteDuplication(a1)