我一直在尝试从单个链表中删除第一个节点。我做的是如下
生成简单链接列表后: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;
}
答案 0 :(得分:5)
您需要更改调用Delete
的方式。它应该是
head = Delete ( head );
您拥有代码的方式,指定head
为head->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(是一个记忆第一个元素地址的指针)。 希望能帮到你!