如何在c ++中删除链表的第一个节点

时间:2014-11-27 21:23:32

标签: c++ linked-list

我一直在尝试从单个链表中删除第一个节点。我做的是如下

  • 创建指向头节点的临时节点
  • 将头部移动到下一个节点
  • 释放临时节点并返回头部

生成简单链接列表后:1 - > 2 -> 3 -> 4 -> 5

并调用我的方法删除第一个节点,结果是不正确的。它返回以下链接列表:0 -> 2 -> 3 -> 4 -> 5

我不明白为什么0仍然存在。

#include <cstdlib>
#include <iostream>

using namespace std;

struct Node
{
    int data;
    struct Node *next;
};

Node* Delete(Node *head)
{
    Node* temp = head;
    head = head->next;
    delete temp;
    return head;
}

int main(void) {

    Node* head = new Node();
    Node*  temp = head;

    for(int i=1; i<=5; i++)
    {
        Node* newNode = new Node();
        newNode->data = i;
        newNode->next = NULL;

        temp->next = newNode;
        temp = newNode;
    }

    Delete( head = head->next );

    while(head != NULL)
    {
        cout<<head->data<<" ";
        head = head->next;
    }
    cout<<endl;     

   return 0;
}

4 个答案:

答案 0 :(得分:5)

您需要更改调用Delete的方式。它应该是

head = Delete ( head );

您拥有代码的方式,指定headhead->next并在Delete上致电head->next

答案 1 :(得分:0)

此外,对删除的调用是错误的,你混合新的和免费管理动态内存,正如人们之前说的那样,你有一个0值,因为初始列表是0 - &gt; 1 - &gt; 2 - &gt; 3 - &gt; 4 - &gt; 5.你开始没有任何初始值,并且头部 - >数据是0。

答案 2 :(得分:0)

我想在这里强调两件事-

首先:您的代码在此处生成的链表是0-> 1-> 2-> 3-> 4-> 5

第二个:通过查看代码,您似乎打算在链表的第二个节点(头->下一个)上调用Delete,而在第一个节点(头)上不调用。

但是,您首先需要更正调用Delete的方式。因此,如果要删除链表的第一个节点(头),请按以下方式调用它:

head = Delete(head);

您应该很好。输出为:1-> 2-> 3-> 4-> 5(根据您首先创建的链接列表,这是正确的)

希望这会有所帮助。

答案 3 :(得分:0)

我认为您可以用更简单的方式编写删除函数。 例如你可以这样写:

void Delete(nod * &p)
{
    nod * t = p -> urm;
    p = t;
}

我只想指出,我的母语不是英语,因此这些变量可能对您没有意义; 这是解释: 你会引用 p 因为它会改变 element 会改变。 p = 第一个元素;点头 = 节点; urm = next(是一个记忆第一个元素地址的指针)。 希望能帮到你!