2017-03-10 5 views
2

以下のコードを実行してリンクリストから重複を削除しています。しかし、私のコードは、重複を削除する前に、リンクされたリストのみを表示します。 removeDupメソッドが呼び出されると、何も印刷されません。以下は私のコードです。何が欠けているのか教えてください。リンクリストから重複を削除するPython

class Node: 
    def __init__(self, data): 
     self.data = data 
     self.next = None 

class LinkedList: 
    def __init__(self): 
     self.head = None 

    def insert(self, data): 
     node = Node(data) 
     node.next=self.head 
     self.head = node 

    def printl(self): 
     current = self.head 
     while current: 
      print current.data 
      current= current.next 

    def removeDups(self): 
     current = self.head 
     while current is not None: 
      second = current.next 
      while second: 
       if second.data == current.data: 
        current.next = second.next.next 

       second = second.next 
      current = current.next 
#  l.printl() 


l= LinkedList() 
l.insert(15) 
l.insert(14) 
l.insert(16) 
l.insert(15) 
l.insert(15) 
l.insert(14) 
l.insert(18) 
l.insert(159) 
l.insert(12) 
l.insert(10) 
l.insert(15) 
l.insert(14) 

l.printl() 
print "===============" 

l.removeDups() 
l.printl() 

答えて

2

あなたが見つけた重複したアイテムを削除するロジックは正しくありません。最初の値の出現から最後の出現までの間のすべての項目を切り捨てます。あなたのサンプルリストでは、重複排除の実行後に14という1つの項目が表示されます(最初の値の直後から最後までが切り捨てられますが、それに伴っていくつかの小さな切り取りが行われます)。

ここには、removeDupsメソッドの固定バージョンがあります。

def removeDups(self): 
    current = second = self.head 
    while current is not None: 
     while second.next is not None: # check second.next here rather than second 
      if second.next.data == current.data: # check second.next.data, not second.data 
       second.next = second.next.next # cut second.next out of the list 
      else: 
       second = second.next # put this line in an else, to avoid skipping items 
     current = second = current.next 

主な変更点は、前ノードからsecondポイント、第2ノード、我々は実際に確認するに興味を持っているということです。我々はsecond.nextに関するすべての作業を行います。我々は容易にsecond.nextをリストから除外できるように、参照をsecondに保つ必要があります。このようにするには、ノードを切り捨てた場合にはsecondを先行させないようにする必要があります。したがって、second = second.next行はelse句にする必要があります。

currentに更新するたびにcurrentsecondは常に同じ値で開始するので、論理を変更して1つのステートメントに割り当てます。それは元の方法でうまくいく、私はちょうどこの方法がよりよく見えると思う。

+0

私はまだそれが他の要素をどのようにカットするのか分からなかった。 –

+0

リンクされたリストを紙(またはホワイトボードなど)に書き出すと便利です。 '1 - > 2 - > 3 - > 1 - > 4'のようなリストを試し、アルゴリズムを実行するときに' current'と 'second'の余分な矢印を描きます。たとえば、 'current'が最初のノード(最初の' 1')を指し、 'second'が' 3'ノードを指すとき、2つの '1 'の値が互いに等しいことを確認し、 '3'ノードを' 4'ノードにリンクします(重複する '1'を切り捨てます)。 – Blckknght

+0

ありがとうございました... –

関連する問題