修改链表的最后一个节点或第一个节点?

时间:2012-10-31 06:52:14

标签: java

假设我有一个名为L的链表,用于存储链表:

LinkedList <LinkedList<String>> L

如果我L1 = L.getLast(),我还可以说L.getLast.add("something")L1.add("something")并且会在最后一个列表中添加“某些内容”,还是只添加该列表的本地实例?

3 个答案:

答案 0 :(得分:1)

  

会在最后一个列表中添加“something”还是只添加该列表的本地实例?

由于您要添加两个引用(非实例)指向的相同列表,因此代码行将相同。

鉴于

LinkedList <LinkedList<String>> L

以下两个片段将完全相同

  • 指向最后一个节点的本地引用(它不是所谓的实例)。

    L1 = L.getLast() 
    
    L1.add("something") 
    
  • 没有本地参考,但使用存储在外LinkedList L

    中的参考
    L.getLast.add("something") 
    

答案 1 :(得分:0)

“列表的本地实例”是什么意思?我们在这里处理引用类型 - 外部列表中存储的内容只是引用到列表实例。当您获取最后一个元素时,它只会获取引用的副本。无论您如何访问该对象,您仍然在修改该单个对象。

您通过创建LinkedList<LinkedList<String>>使您的示例更加复杂,但从根本上说,这是我们可以使用StringBuilder轻松演示的相同问题:

StringBuilder x = new StringBuilder();
StringBuilder y = x; // Copies the *reference*, not an object
y.append("foo");
System.out.println(x); // Prints "foo"

同样,我们有一个StringBuilder对象,xy的值都是对同一个对象的引用。无论你如何修改它,修改都是可见的,然后你可以访问该对象。

或者如果您想使用列表作为示例:

List<String> list1 = new ArrayList<String>();
List<String> list2 = list1;
list1.add("help");
System.out.println(list2.size()); // Prints 1

这对理解Java至关重要 - 所有类的工作方式相同。表达式的值是从不对象;它始终是参考值或原始值。

答案 2 :(得分:0)

L1和l.getLast()都引用相同的Object(父链表中的Last)。

你可以使用L1.addLast(“something”)或l.getlast()。addlast(“something”)将在最后一个列表中添加“something”。