我正在学习Java数据结构课程,目前正在学习单链表。在addHead的方法中,为什么我们需要检查tail==null?如果是真的,为什么尾巴=头?
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
您的列表实现还允许追加到末尾。
为了有效地执行此操作,列表维护一个指向其最后一个元素的尾部指针。不使用该指针也可以这样做,但是每次都需要遍历整个列表来查找最后一个元素,将O(1)改为附加O(N)。出于同样的原因,您的实现也有一个大小计数器。
将新元素添加到以前的空列表时,需要将指针调整为指向新创建的单个节点。
请注意,当添加到列表的前面时,您只需在列表之前为空时调整尾部。在所有其他情况下,尾部保持不变,只有头部和大小发生变化。
在头中,是对列表中第一个节点的引用
Intail
是对列表中最后一个节点的引用
(尾部引用用于允许在固定时间内向列表末尾添加元素。)
空列表具有头==null和尾==null
具有一个元素的列表具有头==尾,头!=null和tail!=空
包含多个元素的列表具有头!=尾部,头部null和tail!=空
。
添加头为新元素创建一个新节点,引用列表中存储在头中的下一个节点(第一个元素为空)。头被指定为新创建的节点的引用。
将第一个元素添加到列表时,if(tail==null)为true。对n的引用已经保存在head中,还需要用tail=head保存在tail中(也可以是:tail=n;)以满足head==tail条件。
将其他元素添加到列表的头(addHead
)时,尾不会更改,但应继续指向列表的最后一个节点。
我是Java初学者,目前正在完成有关DSA的Udemy课程。我正在学习链表,并且正在研究在链表中插入和删除节点的方法。 从我所学到的到目前为止,我知道我们使用条件来检查链接列表是否是空的。 如果条件为true,则LinkedList为空,否则它不为空。 然而,我们不应该检查是否,因为尾巴将始终引用LinkedList中的最后一个节点,即使我们使? 这是我的密码:
让我澄清一下我的问题,OnCreate方法用于初始化视图并展平布局,因此我认为,如果OnCreate方法在一切之前运行,意味着我的EditText字段为空意味着为空,那么这个条件是如何工作的。但它运行良好,这意味着我理解错误。请告诉我我错过了什么。 代码片段取自google codelabs,我们在那里提供电话号码。在editText中,通过点击设备内置键盘上的发送按钮,我们启动电话应用程序来拨打
假设我在程序中有一段代码: 有人建议我在调用消息之前检查消息的空值。getUserId()。 检查null有两种方法:第一种: 第二种方式: 我的问题是: 哪种方式对null检查更好?返回还是抛出异常? 为什么我们在这里需要空检查?如果我们不这样做,那么无论如何都会抛出。
问题内容: 有没有之间的差异和。如果我进行双重布尔检查,这种方法是正确的还是多余的?有没有更短的方法来做同样的事情? 问题答案: 这是完全多余的。或多或少简写,并且是类似于。即做相反的事情,再加上一个额外的检查值的 真实性 。 换句话说,与相同,但是如果变量不存在,则不会发出警告。这就是该函数的重点:进行布尔比较,而不必担心设置变量。 手册说得像这样: 与的相反, 只是未设置变量时不生成警告。 您
问题内容: 我正在尝试学习pthread_cond_wait的基础知识。在所有用法中,我都可以看到 要么 我的问题是,我们只想cond_wait因为条件为假。那我为什么要忍受明确地放置一个if / while循环的痛苦。我可以理解,在不进行任何if / while检查的情况下,我们将直接击中它,根本不会返回。条件检查是仅用于解决此目的,还是具有其他意义。如果它用于解决不必要的条件等待,则进行条件检
问题内容: 我开始于: 然后尝试: 最终: 从那以后我发现: 因此,我已经解决了最初的问题(有点),但是为什么数组不能互相匹配? 问题答案: Javascript数组是对象,您不能简单地使用相等运算符来了解那些对象的 内容 是否相同。如果两个物体实际上是完全一样的情况下(如平等运营商将只测试,作品和太)。 如果您需要检查两个数组是否相等,我建议只遍历两个数组并验证所有元素具有相同的值(并且两个数组