为什么我需要在链表中返回头部?c ++

时间:2018-04-26 21:18:51

标签: c++ data-structures

NODE* InsertAtHead(NODE* &head, int val){
    NODE *tmp = new NODE;

    //create a new node
    if (tmp == NULL)
        exit(1);

    //Initialize the new node
    tmp->data = val;
    tmp->next = NULL;

    //Insert by changing links
    tmp->next = head;
    head = tmp;         //update head
    return head;
}

为什么最后我们需要放回头?

2 个答案:

答案 0 :(得分:2)

您拥有的链接列表是一个独特的链接列表。它只有下一个参考,所以你只能迭代到最后。如果你有一个指向开头的指针你可以到达所有东西,但是如果你有一个指向中间的指针,你就不知道它的开头。

在此功能中,您正在预先设置,这将创建一个新的开始。如果你没有返回新的开头那么调用函数将不知道这个元素。

这是非常重要的,因为你使用new来分配内存,如果它没有被释放,就会出现内存泄漏。除非调用函数具有此指针,否则无法释放它。

答案 1 :(得分:0)

链接列表(当人们说链接列表时,它们通常表示单个链接列表)具有指向下一个节点的链接,并且没有指向前一个节点的链接。所以想象一下,如果你返回一个位于列表中间的节点,你可以到达下一个节点,然后到下一个节点,这很好。你遇到问题的地方是你将无法转到上一个节点,除非你有链接到它,这会使它成为双链表,或者指向列表中head第一个节点的指针作为一个开始。

在您的情况下,您将节点推到列表的前面,因此您的代码将前一个头推到下一个并使新节点成为头节点。

编辑: head应该通过引用传递。 val应该按值传递。为什么?对于head,我们需要一个地址,以便我们可以建立一个链接。对于val如果我们通过引用传递它,地址可能会在调用函数中重用,我们不希望我们的数据发生变化。