Java初学者:如何将一个链表链接到另一个?

时间:2011-01-18 16:01:07

标签: java linked-list

如果我有:linkedlist1= 1,2,3,4;linkedlist2= 5,6,7;

我是否能够以这种方式将linkedlist2附加到linkedlist1的末尾:linkedlist2.set(0,9999)它更改为linkedlist2 = [999,6,7]linkedlist1变为[1,2,3,4,9999,7,8];

这可能吗?或者我确实需要另一种结构?

以下代码不起作用:

 List<Double> l1 = new LinkedList<Double>(Arrays.asList(1.0,2.0));
 List<Double> l2 = new LinkedList<Double>(Arrays.asList(3.0,4.0));
 l1.addAll(l2);
 System.out.println(l1);
 l2.set(0, 9.0);
 System.out.println(l1);

输出:

 [1.0, 2.0, 3.0, 4.0]
 [1.0, 2.0, 3.0, 4.0]

6 个答案:

答案 0 :(得分:5)

Java提供的标准LinkedList类缺少此功能。

正如Donal Boyle发布的那样,您可以将一个列表的内容添加到另一个列表中,但这并不像您的描述那样保持链接。

答案 1 :(得分:1)

你不能但作为替代方案你可以有一个列表清单,但我不知道这是否可以按你的需要运作:

import java.util.*;
import static java.lang.System.out;
class ListOfLists { 
  public static void main( String ... args ) { 

    List<Integer> a = new LinkedList<Integer>(Arrays.asList(1,2,3,4));
    List<Integer> b = new LinkedList<Integer>(Arrays.asList(5,6,7));  

    List<List> list = new LinkedList<List>();
    list.add( a );
    list.add( b );

    out.println("Before : " + list );
    b.set( 0, 999 );

    out.println("After  : " + list );

  }
}

Before : [[1, 2, 3, 4], [5, 6, 7]]
After  : [[1, 2, 3, 4], [999, 6, 7]]

答案 2 :(得分:0)

要回答有关更新一个列表并查看另一个列表中反映的更新的问题,答案取决于它。

如果更新第一个列表中的对象,您将看到更改。但如果你更换对象,你将看不到变化。在第一个列表上调用.set()将替换列表中的对象。不幸的是,在不替换它的情况下,无法更新基元(或其类表示,在本例中为Float)的值。

要附加两个列表,假设您使用的是java.util.LinkedList,则可以调用addAll

答案 3 :(得分:0)

addAll()只获取第二个链接列表中的值。对第二个列表中的索引和设置值的更改不会影响第一个。 (注意:对象本身的更改将保留,因为它们都指向同一个对象)。

如果您正在寻找,可以制作列表清单。

答案 4 :(得分:0)

实现此目的的最简单方法是为您的项目设置适当的类,并使此类MyInt的实例相互链接,而不是依赖于LinkedList,即添加MyInt next;字段保存整数的自定义类。 然后按照描述链接它们。 然后可以在不触及列表结构的情况下对一个实例进行更改,并在通过next引用迭代此列表时进行相应反映。

答案 5 :(得分:0)

这个问题似乎是subList(int, int)方法的一个很好的应用程序:

List<Double> l1 = new LinkedList<Double>(Arrays.asList(1.0, 2.0, 3.0, 4.0));
List<Double> l2 = l1.subList(2, 4);

唉,subList的JavaDoc声明:

  

返回的列表的语义   如果这个方法变得不确定   支持列表(即此列表)是   以其他方式进行结构修改   而不是通过返回的列表。   (结构修改是那些   这会改变这个列表的大小,或者   否则就会以这种方式扰乱它   正在进行的迭代可能会产生   结果不正确。)

因此,如果您想在l1上使用.add之类的方法,那么您可能会失败。实际上,对于从AbstractList派生的所有 fail-fast 列表类(例如LinkedList),subList应该在父列表之后抛出ConcurrentModificationException subList在结构上进行了修改。

但是,如果您远离父列表中的结构修改(或者如果您在修改后重新创建子列表),那么一切都将按预期工作。