所以我想知道链接列表中的虚拟头/虚拟节点(不知道使用哪个)是什么。我在教师的课程中找到了它,但没有解释。有人可以告诉我这个定义并给我一个例子吗?
答案 0 :(得分:1)
虚拟节点更像是一个黑客,当你想避免为边缘情况编写额外的代码时,它们通常被使用。
考虑以下在链表中插入尾部的情况:
void insertAtTail(Node node, int i){
Node new = new Node(i);
node.next = new;
return new;
}
当节点不为null时,这可以正常工作。但想象一下我们尝试在空列表上执行insertAtTail()的场景。如果节点为null,则上述编写的代码将不起作用。因此,我们要处理检查节点是否为空的边缘情况:
Node insertAtTail(Node node, int i){
Node new = new Node(i);
if(node == null) {return new;}
node.next = new;
return new;
}
在这样的场景中,虚拟节点派上用场。想象一下,我有一个虚拟节点如下:
Node dummy = new Node(0);
现在我们将这个虚节点传递给调用函数:
insertAtTail(dummy, 5);
当一个虚节点传递给调用函数时,你会发现没有必要在这里检查dummy是否为null。因此,我们可以跳过对空节点的检查:
Node insertAtTail(Node dummy, int i){
Node new = new Node(i);
dummy.next = new;
return new;
}
如您所见,我已在此处删除了空检查。
答案 1 :(得分:0)
当链接列表的 head 根本不包含任何节点时,您将创建一个从 head 指向的虚拟头(节点)。这样你就可以随时达到head.val或head.next没有做任何额外的检查。