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

问题描述 投票:0回答:5

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

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

输出是

[1, 15, 10]

但根据定义,输出应该是

[1, 10, 15]

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

代码片段:代码片段

java data-structures linked-list
5个回答
2
投票

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

让我们追踪代码:

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

1
投票

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

来自add()的文档:

public boolean add(E e) 将指定元素追加到末尾 这份清单。该方法相当于addLast(E)。


1
投票

以及显而易见,因为这可以是

add()
添加到列表的最后并返回一个布尔值,指示添加是否成功。

但另一方面,

addLast()
方法添加了最后一个但其 void 方法,因此它不会返回布尔值。

来自 addlast() 的 javaDoc

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

该方法相当于add(E)。

来自 add() 的 javaDoc

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

该方法等价于addLast(E)。

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

add()

  • 如上所述返回值。
  • add(int index, E element)
    : 这会将某个元素添加到某个索引。

以及来自 add(int index, E element)

javaDoc

在此列表中的指定位置插入指定元素。

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

这个方法会抛出一个

IndexOutOfBoundsException
如果索引超出范围(索引 < 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.

欲了解更多信息,请参阅

addFirst
addLast
在后台如何工作:

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++;
}

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


0
投票

解释如下:

当你这样做

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


0
投票

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

您从一个空列表开始。

addLast(15)
会在此列表的末尾添加 15,所以现在是 [15]
addFirst(1)
会在列表的开头添加 1,所以现在是 [1, 15]
add(10)
会在列表末尾添加 10,所以现在是 [1, 15, 10]

© www.soinside.com 2019 - 2024. All rights reserved.