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]
选择一个动作: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'
问题是您传递给
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
块中应用相同的名称更改,因为用户输入的是值,而不是节点。