Создаю свой собственный односвязный список, не могу сделать функцию insert_after - PullRequest
0 голосов
/ 07 апреля 2019

Я делаю свой собственный Единый связанный список в python. Я узнал, что когда мне нужно вставить после узла 'p', сначала создаю новый узел, указывающий на следующую из p, а затем указываю новый узел со следующей из p.

Но когда я запускаю код ниже, я получаю ошибку

class SList:
    class _Node:
        def __init__(self, element, next = None):
            self._element = element
            self._next = next

        def element(self):
            return self._element

        def next(self):
            return self._next

        def set_element(self, element):
            self._element = element

        def set_next(self, next):
            self._next = next

    def __init__(self, head = None):
        self._head = head
.
.
.
.
def insert_after(self, element, p): 
        # element is new node, and p is the node already in SLL.
        new_node = self._Node(element, p.next())
        p.next() = new_node

Вывод становится таким ...

File "<ipython-input-100-f46148f593d4>", line 74
    element.next() = new_node
    ^
SyntaxError: can't assign to function call

Так что я не могу продолжать, потому что, когда я ввел значение, как это ...

temp = SList()
temp.insert_first("A")
temp.insert_first("B")
temp.insert_first("C")
temp.insert_first("E")
temp.insert_first("F")

temp.insert_after("D", "C")
# I want A,B,C,D,E,F in continuously

Результат ...

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-101-e9d4a6a04b21> in <module>()
      6 temp.insert_first("F")
      7 
----> 8 temp.insert_after("D", "C")
      9 
     10 # s1.delete_first()

<ipython-input-96-aa629a206e57> in insert_after(self, element, p)
     71 
     72     def insert_after(self, element, p):
---> 73         new_node = self._Node(element, p.next)
     74         p.next = new_node
     75 #         new_node = self._Node(element, p._next())

AttributeError: 'str' object has no attribute 'next'

Что не так с функцией insert_after ???

1 Ответ

1 голос
/ 07 апреля 2019

Вы не можете назначить вызов функции, поэтому вы, вероятно, намеревались написать

p._next = new_node

Затем вы передаете строку 'C', когда вы должны пропустить узел из списка, как вы заявилив комментариях.Вы, вероятно, должны найти узел с self._element == 'C' и вместо этого передать его методу.Поэтому добавьте новый метод в SList

def find(self, value):
    current = self._head
    while current:
        if current._element == value:
            return current
        current = current._next
    return None

и затем вызовите

temp.insert_after("D", temp.find("C"))
...