从链表中删除节点

时间:2021-07-19 15:27:11

标签: c++

我正在尝试使用 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;
  }

2 个答案:

答案 0 :(得分:3)

deleteNode() 中,您正在按值传入 head 节点,因此对其所做的任何修改都不会反映回调用者。您需要 return 新的 head,就像对 Insert() 所做的那样,否则您需要通过引用传入 head

void deleteNode(Node* &head, int key)

答案 1 :(得分:0)

您的代码中的错误是您传递给 deleteNode 函数的 head 是按值传递的,因此不会显示对 head 函数所做的更改。您函数中的头部与主函数中的头部不同,它只是该头部的副本,因此要将在 deletenode 函数中应用于头部的相同更改应用于原始头部,您必须传递head(或通过引用传递)。

在您的代码中编辑- 当您通过引用传递值 deleteNode(&head,98);

时,我在 deleteNode 函数的前五行和倒数第三行中应用了更改

编辑代码-

    #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。 希望你会发现它有帮助。