[英]Linked List addLast() method is not working as expected
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。
将指定元素附加到此列表的末尾。
此方法等效于 add(E)。
将指定元素附加到此列表的末尾。
此方法等效于 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.
有关更多信息,这里是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++;
}
我强烈建议您进行实施,以便您可以更好地理解整个概念。 快乐学习。
解释如下:
当你做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.