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;
}
为什么最后我们需要放回头?
答案 0 :(得分:2)
您拥有的链接列表是一个独特的链接列表。它只有下一个参考,所以你只能迭代到最后。如果你有一个指向开头的指针你可以到达所有东西,但是如果你有一个指向中间的指针,你就不知道它的开头。
在此功能中,您正在预先设置,这将创建一个新的开始。如果你没有返回新的开头那么调用函数将不知道这个元素。
这是非常重要的,因为你使用new来分配内存,如果它没有被释放,就会出现内存泄漏。除非调用函数具有此指针,否则无法释放它。
答案 1 :(得分:0)
链接列表(当人们说链接列表时,它们通常表示单个链接列表)具有指向下一个节点的链接,并且没有指向前一个节点的链接。所以想象一下,如果你返回一个位于列表中间的节点,你可以到达下一个节点,然后到下一个节点,这很好。你遇到问题的地方是你将无法转到上一个节点,除非你有链接到它,这会使它成为双链表,或者指向列表中head
第一个节点的指针作为一个开始。
在您的情况下,您将节点推到列表的前面,因此您的代码将前一个头推到下一个并使新节点成为头节点。
编辑:
head
应该通过引用传递。 val
应该按值传递。为什么?对于head
,我们需要一个地址,以便我们可以建立一个链接。对于val
如果我们通过引用传递它,地址可能会在调用函数中重用,我们不希望我们的数据发生变化。