对于Python中的以下代码,我收到错误--AttributeError: 'str' object has no attribute 'next'

问题描述 投票:0回答:1
class Node:

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

class LinkedList:

    def __init__(self):
        self.head = None

    def printList(self):
        temp = self.head
        while(temp):
            print(temp.data)
            temp = temp.next

    def push(self, newData):
        newNode = Node(newData)
        newNode.next = self.head
        self.head = newNode

    def insertAfter(self, prevNode, newData):
        if prevNode is None:
            print("The given node must be in the linked list")
            return
        newNode = Node(newData)
        newNode.next = prevNode.next
        prevNode.next = newNode

    def append(self, newData):
        newNode = Node(newData)
        if self.head is None:
            self.head = newNode
            return
        last = self.head
        while(last.next):
            last = last.next
        last.next = newNode
    def deleteNode(self, key):
        temp = self.head
        if(temp is not None):
            if(temp.data == key):
                self.head = temp.next
                temp = None
                return
        while(temp is not None):
            if temp.data == key:
                break
            prev = temp
            temp = temp.next
        if(temp == None):
            return
        prev.next = temp.next
        temp = None

    def __repr__(self):
        return 'LinkedList(%s)' % str(self)

    def __iter__(self):
        current = self.head
        while current:
            yield current.data
            current = current.next

    def __str__(self):
        return '[%s]' % ', '.join([x for x in self])


if __name__ == '__main__':
    list = LinkedList()

    while True:
        print("1. Add an element")
        print("2. Delete an element")
        print("3. Push an element")
        print("4. Insert after an element")
        print("5. Print the list")
        menu = int(input("Choose an action: "))

        if menu == 1:
            data = input("Add an element: ")
            list.append(data)
        elif menu == 2:
            key = input("Add an existing element to delete: ")
            list.deleteNode(key)
        elif menu == 3:
            newData = input("Push an element: ")
            list.push(newData)
        elif menu == 4:
            prevNode = input("Add an element to insert after[Previous Node]: ")
            newData = input("Add an element to insert after[New Data]: ")
            list.insertAfter(prevNode,newData)
        elif menu == 5:
            print(list)
        else:
            print("Wrong input try again. ")

当我开始在

insertAfter()
中传递一些值时,错误来自
list.insertAfter(prevNode, newData)
但我无法弄清楚错误是如何发生的。

示例输入:
[天哪,iluvu,69]

  1. 添加元素
  2. 删除元素
  3. 推送一个元素
  4. 在元素后面插入
  5. 打印清单

选择一个动作:4

添加一个元素插入到[前一个节点]之后:iluvu

添加一个元素插入到[新数据]之后:enkk

回溯(最近一次调用最后一次):文件“C:/Users/Admin/PycharmProjects/LinkedListIntro/IntroToLinkedList.py”,第 94 行,在 list.insertAfter(prevNode,newData) 文件“C:/Users/Admin/PycharmProjects/ LinkedListIntro/IntroToLinkedList.py”,第 29 行,在 insertAfter newNode.next = prevNode.next AttributeError: 'str' 对象没有属性 'next'

python python-3.x linked-list
1个回答
0
投票

问题是您传递给

insertAfter
两个数据值,但
insertAfter
期望这两个中的第一个是节点实例,而不是数据值。

所以这是你可以做的:

定义一个方法

find
它将在列表中查找给定的数据值并返回包含它的节点:

def find(self, data):
    current = self.head
    while current:
        if current.data == data:
            return current
        current = current.next

现在您可以在

insertAfter
中使用此方法:

# The name of the argument changes:
def insertAfter(self, prevData, newData):
    # Get the node where this data occurs:
    prevNode = self.find(prevData)
    if prevNode is None:
        print("The given node must be in the linked list")
        return
    newNode = Node(newData)
    newNode.next = prevNode.next
    prevNode.next = newNode

最好在

elif menu == 4
块中应用相同的名称更改,因为用户输入的是值,而不是节点。

© www.soinside.com 2019 - 2024. All rights reserved.