【问题标题】:C++ Need help on Remove Node functionC++ 需要有关删除节点功能的帮助
【发布时间】:2022-10-05 16:40:52
【问题描述】:

在过去的几天里,我一直在努力弄清楚如何让这个 remove() 函数工作。我还是个学生,数据结构不是开玩笑的。 我真的需要有关如何获得此功能以从用户输入中删除列表中特定数字的帮助。不管我尝试什么,它仍然无法正常工作。

例如,列表是:[1, 2, 3] 我想删除列表中的第 2 项。我希望 remove() 函数遍历列表,如果找到数字 2,则删除数字 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;
           
       }
   }

   // Removes the node with the specified number value from the list. Returns
   // true if the node is found and removed, false otherwise.
   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;
   }

编辑:我能够解决我自己的问题,谢谢大家。

bool Remove(double number) {
       // Your code here (remove placeholder line below)
       Node* temp = head;  //Make a temporary node point to head.
       
       if (temp == nullptr || head == nullptr) {  //if user don\'t provide input, return false.
           return false;
       }
       if (head->GetData() == number) {  //If number need to delete is at head.
           head = head->GetNext();
           return true;
       }
       else {
           while (temp != nullptr) {  //Travese temp node throught out a list.
               Node* curNode = temp->GetNext();  //Make a current node point at temp next.
               Node* preNode = temp;
               Node* sucNode = curNode->GetNext();
               if(curNode->GetData() == number) {  //Delete a node if number is found on the list
                   if (curNode->GetNext() == nullptr) {  //Delete at tail.
                       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;
   }
};
  • 你真的应该画一张图,用方框表示节点,用线表示链接,以说明当你从双向链表中删除节点时所做的事情。如果当前节点数据等于个数,则要将前一个节点next设置为当前节点next,将下一个节点的prev设置为当前节点prev。这会从链中取消链接已删除的节点,并在删除该链接时正确设置链接。你这样做了吗(即在纸上画出做了什么?)
  • 您可能想阅读How to Ask。建议以您的问题开始您的问题。从不知道答案的借口开始是浪费每个人的时间(包括你的)。
  • 看语句delete curNode; 执行的时候能拼出条件吗?多少次?你想要不止一次吗?你还有delete temp;什么时候执行?你想让这两个都被处决吗?

标签: c++ data-structures


【解决方案1】:

您应该使 Node 成为 SortedNumberList 的朋友类,或者在稍后的类中定义前者,这在一定程度上简化了代码。这是个人喜好,但它会减少不必要的样板代码(getter 和 setter)。

在双链表中,您不需要像在单链表上那样跟踪最后一个,因为您有两个可用的指针。

这个任务只是一个迭代来寻找价值的问题,当我们通过标记时要注意尽早削减它,因为它是一个排序列表。

然后删除对象并更新链接指针。

   bool Remove(double number) {
       // Loop through the entire list
       Node* temp = head;     
       while ( temp != nullptr) { 

           // There is no point looking forward if the list is sorted
           if (temp->data > number ) return false;

           // Compare to find
           if (temp->data == number) {

               // Get the pointers so we can delete the object
               Node* prev = temp->previous;
               Node* next = temp->next;

               // Delete object
               delete temp;

               // Update previous pointers
               if ( prev==nullptr ) {
                   head = next;
               } else {
                   prev->next = next;
               }

               // Update next pointers
               if ( next==nullptr ) {
                   tail = prev;
               } else {
                   next->previous = prev;
               }   

               // Indicate success
               return true;
           }
       }

       // We iterated to the end and did not find it
       return false;
   }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多