对于addHead方法,为什么要检查tail == null?

时间:2019-07-20 01:35:05

标签: java singly-linked-list

我正在学习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

2 个答案:

答案 0 :(得分:1)

您的列表实现还允许追加到末尾。

为使此工作有效,该列表保留指向其最后一个元素的tail指针。可以不用该指针就可以完成此操作,但是您每次都需要遍历整个列表以查找最后一个元素,从而添加O(N)而不是O(1)。出于同样的原因,您的实现还具有一个size计数器。

将新元素添加到以前为空的列表时,需要调整tail指针以指向新创建的单个节点。

请注意,添加到列表的最前面时,只需在列表为空之前调整tail。在所有其他情况下,tail保持原样,只有headsize发生变化。

答案 1 :(得分:1)

head中的

是对列表中第一个节点的引用。
tail中是对列表中最后一个节点的引用。
tail参考用于允许在恒定时间内将元素添加到列表的末尾。)

一个空列表包含head == nulltail == null
具有一个元素的列表包含head == tailhead != nulltail != null
元素多于一个的列表包含head != tailhead != nulltail != null

addHead为新元素n创建一个新节点d,并引用存储在head中的列表中的下一个节点(为空)对于第一个元素)。为head分配了对该新创建的节点n的引用。

将第一个元素添加到列表时,if(tail == null)为true。对n的引用已保存在head中,并且还需要与tail(也可能是tail = head;)一起保存在tail = n;中,以实现{{ 1}}条件。

将其他元素添加到列表(head == tail)的head时,addHead不会更改,但应继续指向列表的最后一个节点。 / p>