我是数据结构的新手。当您创建具有头部和尾部节点的链接列表时,为什么我必须将新节点链接到尾部? tail.next是否足以链接到newNode? p> 像这样:
public void add( Object data ) {
ListNode newNode = new ListNode( data );
if ( isEmpty() ) {
head = newNode;
} else {
tail.setNext( newNode );
}
tail = newNode;
length = length + 1;
}
或者像这样:
if(head == null) {
head = tail = newNode;
} else {
tail.next = newNode;
tail = newNode;
}
我查了一下LinkedList的基础,但我仍然无法理解这一点。我不知道如果你用newNode替换tail,这会让head链接到tail以及tail如何保留之前的值。你能解释一下吗?非常感谢你!
答案 0 :(得分:2)
头部没有链接到尾部。您应该将它们视为单独的项目。头指向列表的开头并且尾到尾。我们假设您只是为了简单起见而添加并且永远不会删除。
头部和尾部开始为空(指向NULL)。使用第一个newNode(让它称之为A),添加head和tail都设置为A ...因为根据定义,它是唯一的条目,包括开始和结束。
当你添加第二个节点(B)然后头保持不变时,当前的tail.next设置为B(它也设置head.next)。然后将尾部设置为B.
添加了第三个节点(C),磁头根本没有变化。但是tail.next设置为C,尾部移动到C.所以我们现在有A.next = B,B.next = C和C.next为NULL。头部指向A处,尾部指向C处。
答案 1 :(得分:1)
当列表只有一个节点时,head
和tail
指向同一节点,因此更改为指向更改两者所指向的节点(直到您更改head
或tail
)。因此,在这种情况下,让tail.next
指向新节点也会使head.next
指向它。当列表较长时,对tail
的更改不会影响head
(您不希望它们出现!)
答案 2 :(得分:0)
让我们看一个例子:
您的列表中有A
。您想添加B
。执行此操作时,A
指向B
作为其后继者,B
指向最后一个节点(尾部)。
这正是每次添加新节点时代码中发生的情况。前一个尾部将其位置传递给新尾部,但必须保留对新尾部的引用,以便列表可以保持互连。
我希望它有所帮助,
最诚挚的问候,