如何用O(1)空间和O(n)时间反转列表?
问题内容:
我正在寻找一种方法来反转给定列表的相同实例,并增加O(1)个空间和O(n)时间。
这不是硬件,也不是我在寻找某种图书馆方法来为我完成这项工作,因为这仅仅是我自己的一种锻炼,出于纯粹的好奇心。
有什么想法如何使用O(1)额外空间和O(n)时间来做到这一点?(并且如果可能的话也没有反射)?
签名是public <T> void reverse(List<T> list)
。
(*)假设列表的开头和结尾的get()为O(1),但中间的位置为O(n)。
我想出了一个递归解决方案,但它是O(n)空间,O(n)时间
public <T> void reverseAux(List<T> list,int size) {
if (size == 0) return;
T elem = list.remove(size-1);
reverseAux(list,size-1);
list.add(0,elem);
}
public <T> void reverse(List<T> list) {
reverseAux(list, list.size());
}
编辑: 我正在寻找一个Java解决方案,对于List<T>
,仅实现的假设是头和尾,并使用List<T>
接口的访问时间O(1)。
问题答案:
只需阅读以下内容之一。这就是你在说的。
请注意,我们在谈论的是单独的“链接”列表。
http://www.teamten.com/lawrence/writings/reverse_a_linked_list.html
http://www.mytechinterviews.com/reverse-a-linked-
list
http://www.geekpedia.com/code48_Reverse-a-linked-
list.html
http://www.codeproject.com/KB/recipes/ReverseLinkedList.aspx
加上一个额外的问题给您:
N
假设元素是单链的并且只有头指针具有O(1)空间和O(N)时间,那么如何从链表的尾部找到元素?