You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++双向链表Remove函数实现求助及问题解决

双向链表Remove函数的实现问题及修正方案

作为一名学生,最近几天一直在琢磨怎么让remove()函数正常工作,数据结构学起来真不容易。我要实现的功能是:从链表中删除用户输入的指定数值节点,比如链表是[1, 2, 3]时,删除数值为2的节点,要求函数遍历链表找到目标节点后完成删除。

最初的实现代码

class SortedNumberList {
public:
   Node* head;
   Node* tail;

   SortedNumberList() {
      head = nullptr;
      tail = nullptr;
   }

   void Insert(double number) {
       Node* newNode = new Node(number);
       if (head == nullptr) {
           head = newNode;
           tail = newNode;
       }
       else {
           tail->SetNext(newNode);
           tail = newNode;
           
       }
   }

   // 移除链表中包含指定数值的节点,找到并移除返回true,否则返回false
   bool Remove(double number) {
       Node* temp = head;     
       if (temp == nullptr) {
           return false;
       }
       if (head->GetData() == number) {
           head = head->GetNext();
           return true;
       }
       else{
           while (temp != nullptr) {
           Node* curNode = temp;
           Node* preNode = nullptr;
           preNode = curNode->GetPrevious();
           temp = temp->GetNext();
               if (curNode->GetData() == number) {
                   preNode = curNode->GetNext();
                   return true;
               }
               delete curNode;
           }
       }
       delete temp;
   }
};

class Node {
protected:
   double data;
   Node* next;
   Node* previous;

public:
   Node(double initialData) {
      data = initialData;
      next = nullptr;
      previous = nullptr;
   }

   Node(double initialData, Node* nextNode, Node* previousNode) {
      data = initialData;
      next = nextNode;
      previous = previousNode;
   }
};

编辑说明:我已经自己解决了这个问题,感谢大家的帮助。

修正后的Remove函数代码

bool Remove(double number) {
       // 临时节点指向链表头
       Node* temp = head;  
       
       // 链表为空时返回false
       if (temp == nullptr || head == nullptr) {  
           return false;
       }
       // 要删除的节点是头节点的情况
       if (head->GetData() == number) {  
           head = head->GetNext();
           return true;
       }
       else {
           // 遍历链表
           while (temp != nullptr) {  
               // 当前节点指向临时节点的下一个节点
               Node* curNode = temp->GetNext();  
               Node* preNode = temp;
               Node* sucNode = curNode->GetNext();
               // 找到目标节点
               if(curNode->GetData() == number) {  
                   // 要删除的是尾节点的情况
                   if (curNode->GetNext() == nullptr) {  
                       preNode->SetNext(nullptr);
                       tail = preNode;
                       delete curNode;
                       return true;
                   }
                   // 要删除的是中间节点的情况
                   if (curNode->GetNext() != nullptr) {
                       preNode->SetNext(sucNode);
                       sucNode->SetPrevious(preNode);
                       delete curNode;
                       return true;
                   }
               }
               temp = temp->GetNext();
           }
       }
       return false;
   }
};

内容的提问来源于stack exchange,提问作者Jimmy L

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 00:10:51