我正在寻找一种方法来反转给定列表的相同实例,并增加O(1)个空间和O(n)时间。 这不是硬件,也不是我在寻找某种图书馆方法来为我完成这项工作,因为这仅仅是我自己的一种锻炼,出于纯粹的好奇心。
有什么想法如何使用O(1)额外空间和O(n)时间来做到这一点?(并且如果可能的话也没有反射)? 签名是public <T> void reverse(List<T> list)。
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)。
List<T>
只需阅读以下内容之一。这就是你在说的。
请注意,我们在谈论的是单独的“链接”列表。
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)时间,那么如何从链表的尾部找到元素?
N