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

时间:2011-05-20 18:58:53

标签: java data-structures linked-list

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

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

4 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

这样想:

HEAD -> [the rest of the list]组成的列表的反面恰好是: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)中。

答案 3 :(得分:0)

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