0

Python でリンク リスト クラスを作成しようとしています (無意味ですが、学習課題です)。リンク リストの最初の要素を削除しようとすると、ノードを削除するために記述したメソッドが機能しません。 . 削除するノードがリンク リスト内の他の場所にある場合、このメソッドは正常に機能します。どこが間違っているのか、誰かが私に洞察を与えることができますか?

これまでの私のコードは次のとおりです。

class Node:

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

    def __repr__(self):
      return repr(self.data)

    def printNodes(self):
        while self:
            print self.data
            self = self.next

    def removeNode(self, datum):
        """removes node from linked list"""
        if self.data == datum:
            return self.next
        while self.next:
            if self.next.data == datum:
                self.next = self.next.next
                return self
            self = self.next
4

2 に答える 2

1

removeNodeリンクされたリストの先頭を常に返すように変更し、結果を先頭ノードに割り当てます。そのようです:

def removeNode(self, datum):
    """removes node from linked list and returns head node"""
    head = self
    curr_node = self
    if curr_node.data == datum:
        head = curr_node.next
    else:
        while curr_node.next:
            if curr_node.next.data == datum:
                curr_node.next = self.next.next
                break
            curr_node = curr_node.next
    return head

removeNodeまたは、 back to headの結果を代入する必要を避けたい場合は、次のようにします。

def removeNode(self, datum):
    """removes node from linked list"""
    curr_node = self
    if curr_node.data == datum:
        # steals the the data from the second node
        curr_node.data = curr_node.next.data
        curr_node.next = curr_node.next.next
    else:
        while curr_node.next:
            if curr_node.next.data == datum:
                curr_node.next = curr_node.next.next
                break
            curr_node = curr_node.next

注:を変更するのは間違っていると感じたため、 に割り当てselfました。curr_nodeself

于 2012-10-26T16:51:34.423 に答える
0

コードに示されているように、removeNodeメソッドはリンク リストの新しい最初のノードを返します。head = head.removeNode(1)メソッドを呼び出すだけでなく、使用する必要があります。

于 2012-10-26T16:40:36.810 に答える