繁体   English   中英

链表 addLast() 方法未按预期工作

[英]Linked List addLast() method is not working as expected

根据定义addLast() , addLast() 方法用于将元素添加到列表的最后一个。 但是在下面的代码中没有发生。

LinkedList<Integer> demo = new LinkedList<>();
demo.addLast(15);
demo.addFirst(1);
demo.add(10);
System.out.println(demo);

output 是

[1, 15, 10]

但根据定义 output 应该是

[1, 10, 15]

因为 addLast() 方法应该将 15 添加到列表的最后一个。 我不确定这里到底是什么问题。

代码片段:代码片段

addLast在列表末尾添加一个项目 - 这并不意味着添加其他项目时它将保留在列表末尾。

让我们跟踪代码:

  • 你从一个空列表开始。
  • addLast(15)将在这个列表的末尾添加 15,所以现在是 [15]
  • addFirst(1)将在列表的开头添加 1,所以现在是 [1, 15]
  • add(10)将在列表末尾添加 10,所以现在是 [1, 15, 10]

addLast()确实将 15 添加到列表的末尾,它将它从[]转移到[15] 稍后您使用add() ,它将另一个元素附加到列表的末尾(在15之后)。

add()的文档中:

public boolean add(E e) 将指定元素附加到此列表的末尾。 此方法等效于 addLast(E)。

也很明显,因为这可以是列表最后的add()添加并返回 boolean 指示添加是否成功。

但另一方面, addLast()方法添加了最后一个但它的 void 方法,因此它不会返回 boolean。

来自addlast() 的 javaDoc

将指定元素附加到此列表的末尾。

此方法等效于 add(E)。

来自add() 的 javaDoc

将指定元素附加到此列表的末尾。

此方法等效于 addLast(E)。

但出于多种原因,人们可能更喜欢使用add()

  • 正如提到的返回值。
  • add(int index, E element) :它将某个元素添加到某个索引。

并来自add(int index, E element)javaDoc

在此列表中的指定 position 处插入指定元素。

将当前位于该 position 的元素(如果有)和任何后续元素向右移动(将其索引加一)。

这个方法会抛出一个

IndexOutOfBoundsException如果索引超出范围 (index < 0 || index > size())

所以这就是说你所做的一切如下:

demo.addLast(15);//your list now looks like this 15-> null

在这种情况下, 15是头部和尾部。

demo.addFirst(1);/your list now looks like this 1->15->null

现在你有1作为头部/前导元素和15作为尾部/尾随元素。

最后是

demo.add(10);//your list now looks like this 1->15->10->null.

有关更多信息,这里是addFirstaddLast如何在后台工作:

addFirst将调用linkFirst

private void linkFirst(E e) {
    final Node<E> f = first;
    final Node<E> newNode = new Node<>(null, e, f);
    first = newNode;
    if (f == null)
        last = newNode;
    else
        f.prev = newNode;
    size++;
    modCount++;
}

addLast()将调用linkLast

void linkLast(E e) {
    final Node<E> l = last;
    final Node<E> newNode = new Node<>(l, e, null);
    last = newNode;
    if (l == null)
        first = newNode;
    else
        l.next = newNode;
    size++;
    modCount++;
}

我强烈建议您进行实施,以便您可以更好地理解整个概念。 快乐学习。

解释如下:

当你做demo.addLast(15)考虑你的列表是空的,所以你只有[15]之后你做了demo.addFirst(1) ,根据它将在开始时插入的定义,所以你有 [1, 15],最后你做了 demo.add(10),它在最后插入,所以你有[1, 15, 10] ,当你打印时它将是[1, 15, 10]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM