前段时间我决定学习算法但是单独做这件事并不是一件容易的事,所以我正在阅读古德里奇的一本书 Python中的数据结构和算法,但我我坚持锻炼C-7.27
给出单链接列表类的递归实现,这样非空列表的实例存储其第一个元素和对剩余元素列表的引用。提示:查看头节点后面的节点链本身形成另一个列表。
我之前使用函数进行了递归,但在类级别上对我来说有点抽象。 我有这个基础结构,我不知道如何继续。
class SinglyLinkedList:
'''A base class providing a single linked list representation'''
class _Node:
"""non public class for storing a singly linked node"""
__slots__ = '_element', '_next' # streamline memory usage
def __init__(self, element, next_el):
self._element = element
self._next = next_el
def __init__(self):
self._header = self._Node(None, None)
self._header._next = self._header
self._size = 0
def __len__(self):
return self._size
def is_empty(self):
return self._size == 0
据我了解_Node._next
应该带SinglyLinkedList
类这样的东西:
def append(self, e):
newest = _Node(e, SinglyLinkedList())
但是现在要把它装扮成递归,这样我就可以把它描绘成一个整体。可以帮助我吗?
答案 0 :(得分:1)
首先:在单链表中,最后一个节点不应该链接到任何东西;使用None
表示列表的结尾。在您的代码中,最后一个节点链接回自身。
使用实例的递归只意味着您仍然会调用相同的方法,但是在另一个实例上而不是在self
上使用全局函数或相同的方法。
如果要附加到链接列表,则在下一个节点上调用append()
,并且递归终止条件正在处理附加 no next node 的节点(例如,列表的结尾):
class _Node:
"""non public class for storing a singly linked node"""
__slots__ = '_element', '_next' # streamline memory usage
def __init__(self, element, next_el):
self._element = element
self._next = next_el
def append(self, element):
if self._next is not None:
self._next.append(element)
self._next = SinglyLinkedList._Node(element, None)
您还需要向append()
类添加SinglyLinkedList
方法,以启动递归,并调整长度。
顺便说一下,您希望从self._head = None
中的SinglyLinkedList.__init__
开始获取空列表。追加时处理该案件;空列表 - >创建第一个节点,非空 - >递归:
def append(self, element):
if self._head is None:
self._head = self._Node(element, None)
else:
self._head.append(element)
self._size += 1
请注意,您没有必要“筑巢”。 _Node
课程内SinglyLinkedList
;它只会让你更难听到你自己的代码。我必须在SinglyLinkedList._Node()
内使用_Node.append()
来引用该类;另一种方法是使用type(self)()
。