0

そのため、リンクされたリストの前にアイテムを挿入しようとしましたが、ある程度は機能しますが、完全には機能しません。これが私がこれまでに持っているものです(LinkedListクラスには他にもメソッドがありますが、問題がなかったので省略しました):

class _Node():
    def __init__(self, data=None, link=None):
        self.data = data
        self.link = link

class LinkedList():
    def __init__(self):
        self.first = None
        self.size = 0

    def insert(self, ind, item):
        if self.first is None:
            self.first = _Node(item)
        elif ind == 0:                   # this is where the problem is. When I try to 
            temp = self.first            # insert a node to the front, it seems to
            temp.link = self.first.link  # forget about the rest of the nodes.
            self.first = _Node(item)
            self.first.link = temp  
        else:
            count = 0
            while count != ind - 1:
                count += 1
                self.first = self.first.link
            self.first.link = _Node(item, self.first.link)
        self.size += 1

私はこれをシェルに持っていると言います:

    >>> L = LinkedList()
    >>> L.insert(0, 5)
    >>> L.insert(1, 10)
    >>> L.insert(0, 20)
    >>> L[0]
    20
    >>> L[1]
    5
    >>> L[2]
    # and here is an error message, it says NoneType object has no attribute 'data'

上記のコードで、私がやろうとしているのは、最初のノード オブジェクトと同一の一時ノード オブジェクトを作成することです。その一時ノードを最初のノード リンクにリンクし、新しいノードを作成し、その新しいノードをリンクします。ノードを一時ノードに追加しますが、これは機能しません。どんな助けでも素晴らしいでしょう、ありがとう!

4

2 に答える 2

2

「問題ではなかった」という理由で省略した機能が、実際には問題になっているようです...

この方法で各ノードのデータを要求すると、コードが機能します。

>>> L = LinkedList()
>>> L.insert(0,5)
>>> L.insert(1,10)
>>> L.insert(0,20)
>>> print L.first.data
20
>>> print L.first.link.data
5
>>> print L.first.link.link.data
10

を定義している場所に問題がある可能性があります__getitem__。さらに、コメントした部分は、より Pythonic な 1 行に書き直すことができます。

temp = self.first
temp.link = self.first.link
self.first = _Node(item)
self.first.link = temp

最初の 2 行は何もしtempませself.firstself.first.link = self.first.link。次の 2 つは次のように記述できます。

self.first = _Node(item, self.first)
于 2013-03-11T07:39:22.773 に答える
0

まず、実際にはここで空のリストを特別にケース化する必要がないことに注意してください。

def insert(self, ind, item):
    if ind == 0:
        newnode = _Node(item, self.first)
        self.first = newnode

第二に、それは問題ではありません。このコード:

    else:
        count = 0
        while count != ind - 1:
            count += 1
            self.first = self.first.link
        self.first.link = _Node(item, self.first.link)
    self.size += 1

self.first をその場で変更するため、最初のノードが以前のものであったことを忘れてしまいます。これを修正するための最小の変更は次のとおりです。

    else:
        count = 0
        insert_point = self.first # use a local variable to walk the list
        while count != ind - 1:
            count += 1
            insert_point = insert_point.link
        insert_point.link = _Node(item, insert_point.link)
    self.size += 1
于 2013-03-11T07:40:43.550 に答える