【问题标题】:For addHead method why check if tail == null?对于 addHead 方法,为什么要检查 tail == null?
【发布时间】:2019-07-20 01:35:05
【问题描述】:

我正在学习 Java 数据结构课程,目前正在学习单链表。在addHead的方法中,为什么要检查tail == null?如果为真,为什么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

【问题讨论】:

  • 您需要显示更多代码,以便我们了解如何使用tail。从它的声音来看,列表还存储了一个指向其最后一个元素的指针(仅当它之前为空时,它现在已更改)
  • 嘿@Thilo 我已经插入了我正在研究的代码的链接,感谢您抽出时间提供帮助。
  • 当列表不为空时,tail 应该始终指向列表中的最后一项,对吧?那么,当您刚刚将第一个项目插入列表时,您如何做到这一点?您如何确定您要插入的节点实际上是第一个节点?

标签: java singly-linked-list


【解决方案1】:

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

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

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

将第一个元素添加到列表时,if(tail == null) 为真。对n 的引用已保存在head 中,还需要与tail = head;(也可能:tail = n;)一起保存在tail 中,以满足head == tail 条件。

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

【讨论】:

    【解决方案2】:

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

    为了有效地工作,列表维护了一个指向其最后一个元素的tail 指针。没有该指针也可以做到这一点,但是您每次都需要遍历整个列表以找到最后一个元素,从而追加 O(N) 而不是 O(1)。出于同样的原因,您的实现也有一个size 计数器。

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

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

    【讨论】:

    • 感谢您的解释,帮助消除了我的困惑。
    猜你喜欢
    • 2011-03-09
    • 2020-01-04
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-12
    相关资源
    最近更新 更多