【发布时间】:2016-09-16 10:29:25
【问题描述】:
所以我想确定什么是链表中的虚拟头/虚拟节点。有人可以告诉我定义并给我一个例子吗?
【问题讨论】:
标签: list linked-list
所以我想确定什么是链表中的虚拟头/虚拟节点。有人可以告诉我定义并给我一个例子吗?
【问题讨论】:
标签: list linked-list
虚拟节点更像是一种 hack,通常在您希望避免为边缘情况编写额外代码时使用。
考虑以下在链表尾部插入的情况:
void insertAtTail(Node oldTail, int i){
Node newTail = new Node(i);
oldTail.next = newTail;
return newTail;
}
当 oldTail 不为空时,这可以正常工作。但是想象一下我们试图在一个空列表上执行 insertAtTail() 的场景。如果节点为空,上述编写的代码将不起作用。因此,我们必须处理检查 oldTail 是否为 null 的边缘情况:
Node insertAtTail(Node oldTail, int i){
Node newTail = new Node(i);
if(oldTail == null) {return newTail;}
oldTail.next = newTail;
return newTail;
}
在这种情况下,虚拟节点会派上用场。想象一下,我有一个虚拟节点,如下所示:
Node dummy = new Node(0);
现在我们将这个虚拟节点传递给调用函数:
insertAtTail(dummy, 5);
当一个 dummy 节点被传递给调用函数时,你会发现这里不需要检查 dummy 是否为空。因此,我们可以跳过空节点的检查:
Node insertAtTail(Node dummy, int i){
Node newTail = new Node(i);
dummy.next = newTail;
return newTail;
}
如您所见,我已在此处删除了对 null 的检查。
【讨论】:
当链接列表的 head 根本不包含任何节点时,您将创建一个从该 head 指向的虚拟头(节点)。这样您就可以随时访问,例如head.val 或 head.next 无需进行任何额外检查。
【讨论】: