[英]Python 3 - Using recursion in a linked list
Python 3 - 我是编码新手,发现递归很困难。 我正在制作一个带有递归方法的链表类,用于从列表中添加和删除项目。 现在,如果某个项目恰好是我列表中的第一个项目,我将无法删除该项目。 我写了一些替代代码,如果我包含另一个参数(以前的)和另一个基本情况,可以从列表中删除第一项,但是我只能删除第一项并且花了很长时间试图找出原因所以我报废了完全。 我会很感激的提示!
另外,我已经知道我有吸气剂并且没有正确使用它们。
class Node:
"""
Represents a node in a linked list
"""
def __init__(self, data):
self._data = data
self._next = None
def get_data(self):
"""getter method for data in Node class"""
return self._data
def get_next(self):
"""getter method for next in Node class"""
return self._next
class LinkedList:
"""
A linked list implementation of the List ADT
"""
def __init__(self):
self._head = None
def get_head(self):
"""getter function for head of list"""
return self._head
def add(self, val):
""" Adds a node containing val to the linked list - helper function"""
self._head = self.recursive_add(self._head, val)
def recursive_add(self, node1, val):
""" Adds a node containing val to the linked list """
if node1 is None:
return Node(val)
else:
node1._next = self.recursive_add(node1._next, val)
return node1
def remove(self, val):
"""removed the node containing val from the linked list - helper function"""
self.recursive_remove(self._head, val)
def recursive_remove(self, node1, val):
"""
Removes the node containing val from the linked list
"""
if node1 is None:
return node1
elif node1._data == val:
return node1._next
else:
node1._next = self.recursive_remove(node1._next, val)
return node1
def main():
my_list = LinkedList()
my_list.add(13)
my_list.add(9)
my_list.add(5)
my_list.remove(9)
if __name__ == '__main__':
main()
def remove(self, val):
"""removed the node containing val from the linked list - helper function"""
if self._head and self._head._data == val:
self._head = self._head._next
return
self.recursive_remove(self._head, val)
如果是一开始,则需要更换头部。
在remove
您调用recursive_remove
,但忽略其返回值。 您应该将它用作(可能不同的) _head
引用,必须像在递归方法本身中完成的那样,您有:
node1._next = self.recursive_remove(node1._next, val)
# ^ │
# └───────────────────────────────────┘
请注意node1._next
是如何作为参数传递的,并且该方法的返回值是node1._next
应该以(可能不同的)引用结束。 在remove
的初始调用中应应用相同的模式:
def remove(self, val):
self._head = self.recursive_remove(self._head, val)
# ^ │
# └──────────────────────────────────┘
注意:在add
使用了相同的模式,您可以正确执行此操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.