什么是假人头?

时间:2016-05-19 13:39:16

标签: list linked-list

所以我想知道链接列表中的虚拟头/虚拟节点(不知道使用哪个)是什么。我在教师的课程中找到了它,但没有解释。有人可以告诉我这个定义并给我一个例子吗?

2 个答案:

答案 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没有做任何额外的检查。