一尘不染

如何用O(1)空间和O(n)时间反转列表?

algorithm

我正在寻找一种方法来反转给定列表的相同实例,并增加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)。


阅读 224

收藏
2020-07-28

共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)时间,那么如何从链表的尾部找到元素?

2020-07-28