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
相关产品推荐
相关产品推荐

