制作一个包含头尾节点的链表

时间:2015-02-26 01:52:15

标签: linked-list head tail

我是数据结构的新手。当您创建具有头部和尾部节点的链接列表时,为什么我必须将新节点链接到尾部? tail.next是否足以链接到newNode? 像这样:

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如何保留之前的值。你能解释一下吗?非常感谢你!

3 个答案:

答案 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)

当列表只有一个节点时,headtail指向同一节点,因此更改为指向更改两者所指向的节点(直到您更改headtail)。因此,在这种情况下,让tail.next指向新节点也会使head.next指向它。当列表较长时,对tail的更改不会影响head(您不希望它们出现!)

答案 2 :(得分:0)

让我们看一个例子:

您的列表中有A。您想添加B。执行此操作时,A指向B作为其后继者,B指向最后一个节点(尾部)。

这正是每次添加新节点时代码中发生的情况。前一个尾部将其位置传递给新尾部,但必须保留对新尾部的引用,以便列表可以保持互连。

我希望它有所帮助,

最诚挚的问候,