代码之家  ›  专栏  ›  技术社区  ›  Monica Khoury

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

  •  -2
  • Monica Khoury  · 技术社区  · 6 年前
    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 回复  |  直到 6 年前
        1
  •  1
  •   Paul Childs    6 年前

    您拥有的链表是一个单链表。它只有next的引用,所以您只能迭代到最后。如果你有一个指向开始的指针,你可以找到所有东西,但如果你有一个指向中间的指针,你就不知道开始。

    在这个函数中,您是在预结束,这将创建一个新的开始。如果不返回新的开头,则调用函数将不知道该元素。

    这一点至关重要,因为您正在使用new分配内存,如果不释放内存,就会出现内存泄漏。除非调用函数具有此指针,否则无法释放它。

        2
  •  0
  •   user5550963 user5550963    6 年前

    链表(当人们说链表时,通常是指单个链表)有到下一个节点的链接,而没有到上一个节点的链接。所以想象一下,如果您返回一个位于列表中间的节点,您可以一直访问下一个节点和下一个节点,这很好。您遇到的问题是,除非有指向上一个节点的链接,否则无法转到上一个节点,这将使其成为双链接列表,或者有指向 head 列表中用作起点的第一个节点。

    在本例中,您将节点推到列表的前面,因此您的代码将前一个头部推到下一个头部,并将新节点作为头部节点。

    编辑: 这个 应通过引用传递。 val 应按值传递。为什么?对于 我们需要它的地址,以便我们可以链接到它。对于 val公司 如果我们通过引用传递它,地址可能会在调用方函数中重用,我们不希望数据发生更改。