【问题标题】:What is a Dummy Head?什么是假人头?
【发布时间】:2016-09-16 10:29:25
【问题描述】:

所以我想确定什么是链表中的虚拟头/虚拟节点。有人可以告诉我定义并给我一个例子吗?

【问题讨论】:

标签: list linked-list


【解决方案1】:

虚拟节点更像是一种 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 的检查。

【讨论】:

    【解决方案2】:

    当链接列表的 head 根本不包含任何节点时,您将创建一个从该 head 指向的虚拟头(节点)。这样您就可以随时访问,例如head.valhead.next 无需进行任何额外检查。

    【讨论】:

      猜你喜欢
      • 2021-06-03
      • 1970-01-01
      • 2021-04-15
      • 2017-02-20
      • 1970-01-01
      • 2012-04-24
      • 1970-01-01
      • 2018-07-01
      相关资源
      最近更新 更多