如果我创建了一个链接列表,其中插入顺序为5,4,3。我使用头部引用,因此链表存储为3->4->5->null
。
当我想要反转链表==原始插入顺序时,它将是
5->4->3->null
。现在,如果这是我的新列表的样子,我的头引用应该引用哪个节点,那么我添加到列表中的新元素仍然会有O(1)插入时间?
答案 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所说,你保留两个指针,头部和尾部。您可以使用头部来访问元素和尾部,以便随意添加元素到列表中。