繁体   English   中英

关于反转单链表的递归实现的问题

[英]Question about recursive implementation of reversing a singly linked list

如果我创建了一个链接列表,其中插入顺序为5,4,3。 我使用头部引用,因此链表存储为3->4->5->null

当我想要反转链表==原始插入顺序,这样就可以了
5->4->3->null 现在,如果这是我的新列表的样子,我的头引用应该引用哪个节点,那么我添加到列表中的新元素仍然会有O(1)插入时间?

根据定义,我认为head始终指向列表的第一个元素。

如果要插入O(1)中链接列表的末尾,则保留两个引用,一个引用第一个元素,一个引用最后一个元素。 然后通过跟随对最后一个元素的最后一个引用来完成添加到最后,将新元素添加到最后一个元素之外,更新最后一个引用以指向新的最后一个元素。

插入空列表成为一种特殊情况,因为您必须设置第一个和最后一个引用,而不仅仅是最后一个引用。 类似地,从具有一个元素的列表中删除。

如果你想要单个链表的后面,你应该保留对最后一个元素的引用。 当你想插入一个新元素时,你创建一个新的链接对象,其中新元素为head,后面插入元素的尾部作为尾部,新链接对象作为插入元素的新尾部之后。 这需要三个指针移动,因此需要恒定的时间。

想一想:

HEAD -> [the rest of the list] reverse([the rest of the list]) -> HEAD恰好是: reverse([the rest of the list]) -> HEAD

如果列表包含单个元素,那么您的基本情况就是如此。 这样一个清单的反面就是它本身。

这是一个例子(使用可执行的伪代码,又名Python):

class Node(object):

    def __init__(self, data, next_=None):
        self._data = data
        self._next = next_

    def __str__(self):
        return '[%s] -> %s' % (self._data,
                self._next or 'nil')


def reverse(node):
    # base case
    if node._next is None:
        return node

    # recursive
    head = Node(node._data)     # make a [HEAD] -> nil
    tail_reverse = reverse(node._next)

    # traverse tail_reverse
    current = tail_reverse
    while current._next is not None:
        current = current._next
    current._next = head

    return tail_reverse


if __name__ == '__main__':
    head = Node(0,
            Node(1,
                Node(2,
                    Node(3))))
    print head
    print reverse(head)

请注意,由于缺少最后一个元素引用(仅限HEAD),因此不在O(1)中。

对于任何链接列表具有O(1)插入时间,您必须插入列表的前面或其他任意位置,完全忽略任何顺序。 作为单个链接列表意味着您不能指向列表中的最后一个元素,因为直到最后一个元素的列表将不可访问。 解决这个问题的方法可能就像Shannon Severance所说,你保留两个指针,头部和尾部。 您可以使用头部来访问元素和尾部,以便随意添加元素到列表中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM