【发布时间】:2016-07-29 01:44:27
【问题描述】:
我正在研究计算机科学,但在将节点添加到双向链表数据结构的末尾时遇到了一些困难。我知道新节点指向尾部,尾部指向它,因此我有这个:
public boolean add(E element)
{
// TODO: Implement this method
LLNode<E> newNode = new LLNode<E> (element);
if (element == null) {
throw new NullPointerException("Element can not store a null reference!");
} else {
newNode.next = tail;
newNode.prev = tail.prev;
tail.prev = newNode;
head.next = newNode;
}
size++;
return true;
}
我遇到的问题是尝试连接头节点(通过 head.next 到正确的节点)。
在我的默认构造函数中,head.next 节点指向 tail.prev。但是在 add 方法中,我无法弄清楚 head.next 会指向哪里,因为每次添加新节点时,head 都必须指向 LinkedList 数据结构中的第一个节点。这是默认构造函数:
public MyLinkedList() {
// TODO: Implement this method
size = 0;
/*create two empty nodes at the head and the tail of the linked list*/
head = new LLNode<E> (null);
tail = new LLNode<E> (null);
head.next = tail;
tail.prev = head;
head.prev = null; //Head is a sentinel node with no node prior to it
tail.next = null; //tail is a sentinel node with no node after it
}
请指出我(不是双关语)正确的方向。谢谢!
【问题讨论】:
-
"在我的默认构造函数中,我有 head.next 节点指向 tail.prev" 你没有?
-
Element can not store a null reference!... 说谁?列表结束的标记不是要存储的元素为空,而是下一个指针为空。 -
链表不需要两个虚拟节点。一个虚拟节点就足够了,其中 dummy.prev = 第一个节点或 null,dummy.next = 最后一个节点或 null。第一个节点的 prev 指针和最后一个节点的 next 指针应该为空。您还可以使用对节点的两个引用而不是虚拟节点:头和尾。
-
这个练习的目的不是关于是否需要两个哨兵节点来形成一个链表。当然不是这样。这里的案例是拥有两个哨兵节点并根据 UCSDs MOOC 实现一个双向链表。
-
@Linuxn00b - 唯一的订购要求是在更新之前使用tail.prev(或它的副本):newNode.prev = tail.prev; tail.prev.next = newNode; tail.prev = 新节点;或 newNode.prev = tail.prev; newNode.prev.next = newNode; tail.prev = 新节点;或 newNode.prev = tail.prev; tail.prev = 新节点; newNode.prev.next = newNode; .
标签: java data-structures linked-list