我正在尝试使用 k 作为链表数据删除节点。下面的程序运行良好,但如果我们必须删除头节点,它不会给出所需的输出。例如,如果链表是 98->6->1 而我必须删除 98,那么程序显示的输出是 0->6->1。除了删除头节点外,其他所有情况都可以正常工作。 下面是相同的 C++ 代码。
#include <bits/stdc++.h>
using namespace std;
class Node
{
public :
int data;
Node* next;
};
Node * insert(Node* head, int data) {
Node* new_node= new Node();
new_node->data = data;
new_node->next = head;
head = new_node;
return head;
}
void deleteNode(Node *head, int key)
{
Node *temp = head;
Node *prev = NULL;
if(temp!=NULL && temp->data==key){
head = temp->next;
delete temp;
}
else{
while(temp!=NULL && temp->data!=key){
prev = temp;
temp = temp->next;
}
if(temp == NULL){
return;
}
prev->next = temp->next;
delete temp;
}
}
void display(Node * head) {
while(head != NULL)
{
cout<<head->data<<" ";
head = head->next;
}
}
int main() {
Node * head = NULL;
head = insert(head, 1);
head=insert(head,6);
head=insert(head,98);
deleteNode(head,98);
display(head);
return 0;
}
答案 0 :(得分:3)
在 deleteNode()
中,您正在按值传入 head
节点,因此对其所做的任何修改都不会反映回调用者。您需要 return
新的 head
,就像对 Insert()
所做的那样,否则您需要通过引用传入 head
:
void deleteNode(Node* &head, int key)
答案 1 :(得分:0)
您的代码中的错误是您传递给 deleteNode 函数的 head 是按值传递的,因此不会显示对 head 函数所做的更改。您函数中的头部与主函数中的头部不同,它只是该头部的副本,因此要将在 deletenode 函数中应用于头部的相同更改应用于原始头部,您必须传递head(或通过引用传递)。
在您的代码中编辑-
当您通过引用传递值 deleteNode(&head,98);
编辑代码-
#include <bits/stdc++.h>
using namespace std;
class Node
{
public :
int data;
Node* next;
};
Node * insert(Node* head, int data) {
Node* new_node= new Node();
new_node->data = data;
new_node->next = head;
head = new_node;
return head;
}
void deleteNode(Node **head, int key)
{
Node *temp = *head;
Node *prev = NULL;
if(temp!=NULL && temp->data==key){
*head = temp->next;
temp->next = NULL;
delete temp;
}
else{
while(temp!=NULL && temp->data!=key){
prev = temp;
temp = temp->next;
}
if(temp == NULL){
return;
}
prev->next = temp->next;
// temp->next = NULL;
delete temp;
}
}
void display(Node * head) {
while(head != NULL)
{
cout<<head->data<<" ";
head = head->next;
}
}
int main() {
Node * head = NULL;
head = insert(head, 1);
head=insert(head,6);
head=insert(head,98);
deleteNode(&head,98);
display(head);
return 0;
}
现在,如果您运行上面的代码,删除值为 98 的节点后您将获得的输出为 6->1。 希望你会发现它有帮助。