我正在学习Java数据结构课程,目前正在学习单链表。在addHead方法中,为什么我们需要检查tail == null?当为true时,为什么tail = head?
public void addHead(T d){
Node<T> n = new Node<>(d, head);
head = n;
size++
if(tail == null)
tail = head;
}
此处的完整代码:https://venus.cs.qc.cuny.edu/~ryba/cs313/linkedList/LinkedList.java
答案 0 :(得分:1)
您的列表实现还允许追加到末尾。
为使此工作有效,该列表保留指向其最后一个元素的tail
指针。可以不用该指针就可以完成此操作,但是您每次都需要遍历整个列表以查找最后一个元素,从而添加O(N)而不是O(1)。出于同样的原因,您的实现还具有一个size
计数器。
将新元素添加到以前为空的列表时,需要调整tail
指针以指向新创建的单个节点。
请注意,添加到列表的最前面时,只需在列表为空之前调整tail
。在所有其他情况下,tail
保持原样,只有head
和size
发生变化。
答案 1 :(得分:1)
head
中的是对列表中第一个节点的引用。
在tail
中是对列表中最后一个节点的引用。
(tail
参考用于允许在恒定时间内将元素添加到列表的末尾。)
一个空列表包含head == null
和tail == null
。
具有一个元素的列表包含head == tail
,head != null
和tail != null
。
元素多于一个的列表包含head != tail
,head != null
和tail != null
。
addHead
为新元素n
创建一个新节点d
,并引用存储在head
中的列表中的下一个节点(为空)对于第一个元素)。为head
分配了对该新创建的节点n
的引用。
将第一个元素添加到列表时,if(tail == null)
为true。对n
的引用已保存在head
中,并且还需要与tail
(也可能是tail = head;
)一起保存在tail = n;
中,以实现{{ 1}}条件。
将其他元素添加到列表(head == tail
)的head
时,addHead
不会更改,但应继续指向列表的最后一个节点。 / p>