【问题标题】:Best way to reverse a java.util.LinkedList (in place if possible)反转 java.util.LinkedList 的最佳方法(如果可能的话)
【发布时间】:2012-05-03 21:47:17
【问题描述】:

我想使用可用的方法反转 java.util.LinkedList<Integer>
查看提供的方法和Iterators,我看不到以下选项:

int i = list.size();  
int pos = 0;  
while(i-- > 1){  
     Integer n = list.removeLast();  
     list.add(pos++, n);          
} 

但肯定有更好的方法。我的意思是在迭代器之外修改列表不是一个好主意,但我不知道如何在此处使用一个列表而不必创建新列表。
有没有更好的办法?

【问题讨论】:

  • 这方面已经有很多问题了。你需要搜索。

标签: java algorithm list collections linked-list


【解决方案1】:

使用导入 java.util.Collections;

Collections.reverse(list);

【讨论】:

  • 这是针对链表案例优化的吗?
  • 是的,它区分了 RandomAccess 列表和链表。查看来源;)
【解决方案2】:
【解决方案3】:

有一个 api 方法。

Collections.reverse(yourList);

http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Collections.html#reverse%28java.util.List%29

如果出于某种原因你想自己做,这似乎是最好的方法:

List<T> reversed = new LinkedList<T>();
while(!yourList.isEmpty()) reversed.add(yourList.removeLast());

【讨论】:

  • 第二个例子没有到位
  • 没有一个是就地的。这些只是他们为您提供的通用解决方案,它们适用于任何列表。但不幸的是,环顾四周后,我得出结论,您将无法使用 LinkedList 就地执行此操作。您可以在其source code 中寻找自己。没有办法获得那些构成列表主干的Entry 对象。
  • @user384706 其实api方法已经到位了(不好意思,我的使用例子弄错了)。
【解决方案4】:

我们可以通过这些方式在java中反转Linkedlist

  1. 使用集合 - 我们可以借助集合的 ​​reverse() 方法在 java 中反转列表

    LinkedList<String> linkedList = new LinkedList<String>();
    linkedList.add("Mumbai");
    linkedList.add("Delhi");
    //print linkedlist
    //Reverses the order of the elements in the specified list.
    Collections.reverse(linkedList);
    
  2. 使用 List.set() 方法 我们将 list 的元素首先交换到 end 。依此类推,使用下面的逻辑

        for(int i = 0, mid = list.size()/2, j = list.size() - 1; i < mid; i++, j--)
               list.set(i, list.set(j, list.get(i)));//swap element
         }   
    

参考:How to reverse elements of LikedList

【讨论】:

    猜你喜欢
    • 2011-04-02
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 2013-07-23
    • 2021-06-10
    • 2019-08-29
    相关资源
    最近更新 更多