2016-09-21 5 views
-1

私は[javaの]この投稿hereを見やったと同様のソリューションをしようとしていますが、注意スレッドは完全に私の質問に答えなかった)別のノードの前にノードをPythonの単独リンクリストに挿入しますか?

私は単独リンクリストと協力し、(のinsertBeforeを試してみて、実行したいする必要があります) 方法。私は二重リンクリストは以前の属性を持っていると理解していますが、一重リンクリストはそうではありませんので、これは二重リンクリストを使ってよりうまくいくかもしれませんが、これは課題の要件であり、

これまでのところ、私のNodeクラスのセットアップは私のSinglyLinkedListクラスと一緒になっています。私はまた、私の目標であり、私が立ち往生している私のinsertBefore()メソッドを持っています。

node.next.valueと私のtargetNodeを比較したいと思います(targetNodeは値です)。なぜ、node.next.valueが私に次のエラーを投げかけていますか?私はこれが(上記のスニペットには含まれません)insertAfter()メソッドのために働くことを得ることができたが、targetNodeオブジェクトにnode.nextを一致させるのに苦労しています:if node.next.value == targetNode: AttributeError: 'NoneType' object has no attribute 'value'

# this is our node object 
class Node(object): 
    def __init__(self, value, next=None): 
     self.value = value 
     self.next = next 

# this is our singly linked list object 
class SinglyLinkedList(object): 
    def __init__(self): 
     self.head = None 
     self.tail = None 

    def insertBefore(self, targetNode, value): 
     # create new node 
     newNode = Node(value) 
     # find target node to insert 
     node = self.head 
     if node == None: 
      print 'There aren\'t any nodes to insert before!' 
     else: 
      found = None 
      # search nodes 
      while node: 
       if node.next.value == targetNode: 
        found = True 
        print node.value + ' <--this was node before target' 
        beforeInsert = node 
        afterInsert = node.next 
        beforeInsert.next = newNode 
        newNode.next = afterInsert # sets new node's next to target node 
        node = node.next # continues through while loop 
       else: 
        node = node.next 
      if found != True: 
       print 'Your target node of {} was not found in the list!'.format(targetNode) 

に注意してください。

+0

なぜこの質問をしたのですか?上記の質問に何が問題なのですが、なぜこのようなことを聞​​かないのですか? – natureminded

答えて

0

は、ここで私は私の質問に解決策を見つけることができた方法は次のとおりです。

def insertBefore(self, targetValue, value): 
    # create new node 
    newNode = Node(value) 
    # find target node to insert 
    node = self.head 
    if node == None: 
     print 'There aren\'t any nodes to insert before!' 
    else: 
     found = False 
     # search nodes 
     while node: 
      if node.next == None: 
       break 
      if node.next.value == targetValue: 
       found = True 
       newNode.next = node.next 
       node.next = newNode 
       break 
      else: 
       node = node.next 
     if found != True: 
      print 'Your target node of {} was not found in the list!'.format(targetValue) 

注意、ジョナスは彼のコメントで指摘したようにノード・リスト内の重複しない場合は、上記のソリューションはのみ動作します。

0

あなた自身が示唆しているように、ターゲットノードnode.next == Node(targetNode)を使用して新しいノードを作成すると、これは決して真実ではないようです。

targetNodeがNodeオブジェクトであると仮定します。その場合は、単にnode.next == targetNodeを使用する必要があります。

コードのもう1つの問題は、最初のノードがターゲットノードであるかどうかをチェックしないことです。したがって、insertBefore機能を使用して、Nodeの先頭にノードを挿入することはできません。

次のコードは、指定されたノードの前に新しいノードを挿入するinsertBefore関数の書き換えです。

def insertBefore(self, targetValue, value): 
    # create new node 
    newNode = Node(value) 
    # find target node to insert 
    node = self.head 
    if node == None: 
     print 'There aren\'t any nodes to insert before!' 
    else: 
     # search nodes 
     if node.value == targetValue: 
      newNode.next = self.head 
      self.head = newNode 

     while node.next is not None: 
      if node.next.value == targetValue: 
       print ">>> ",node.value,' <--this was node before target' 
       newNode.next = node.next 
       node.next = newNode 
       return 
      else: 
       node = node.next 
     print 'Your target node of {} was not found in the list!'.format(targetNode.value) 

あなたはtargetNodeは、ターゲットノードの値にしたい場合は、targetNodenode.next.valueを比較する必要があります。これは、ターゲット値が最初に出現する前に値を挿入することに注意してください。したがって、代わりにセットにリストを変換することができます。

+0

実際に 'node.next.value == targetNode'(targetNodeはオブジェクトの値ではありません)を試しましたが、' node.next.value'がそうでないというエラーが出ていたので(私には奇妙だった...)...私は 'node.next'と' node.value'が有効であることを知っていますが、何らかの理由で 'node.next.value'がエラーを投げていました...私はとても近いと私はそれが動作していない理由を理解したいと思います:) – natureminded

+0

私は同じことを考えていたが、あなたの答えは私に次のエラーを与える: 'if node.next。value == targetNode: AttributeError: 'NoneType'オブジェクトに 'value'属性がありません – natureminded

+0

あなたの関数呼び出し方法を表示できますか? 'targetNode'が値であり、ノードでない場合、あなたの命名は少し不明です。また、前に挿入するターゲットとして値を指定した場合は、その値の最初の出現をリストに挿入することしかできません。 – Jonas

関連する問題