在python中递归实现单链表的类

时间:2015-03-05 07:44:10

标签: python algorithm class recursion

前段时间我决定学习算法但是单独做这件事并不是一件容易的事,所以我正在阅读古德里奇的一本书 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())

但是现在要把它装扮成递归,这样我就可以把它描绘成一个整体。可以帮助我吗?

1 个答案:

答案 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)()