【问题标题】:how to delete a single node in linked list c++ [closed]如何删除链表c ++中的单个节点[关闭]
【发布时间】:2021-02-13 14:49:24
【问题描述】:

*已编辑:我的问题是我没有处理要删除的值是 LinkedList 头部的特殊情况。有人在答案部分修复它。

我有一个 Node 类,以及一个删除 String 值与任何节点匹配的节点的函数。

class Node
    {
    public:
        string getName() const
        {
           return name;
        }
        Node* getLink() const
        {
           return link;
        }
    private:
        string name;
        Node* link;
    };
typedef Node* NodePtr;

void deleteOneNode(NodePtr& head, string valueToDelete)
{
    NodePtr currentPtr = head, previousPtr = head;
    while (currentPtr != NULL && currentPtr->getName() != valueToDelete)
    {
        previousPtr = currentPtr;
        currentPtr = currentPtr->getLink();
    }
    if (currentPtr != NULL)
    {
        previousPtr->setLink(currentPtr->getLink());
        delete currentPtr; **afer this code run, the entire linked list is deleted**
    }
}

我只想删除单个节点,而不是整个链表。当我调试链表时,我注意到整个链表在某个时候被删除了。 我不知道我做错了什么?

【问题讨论】:

  • 这段代码运行后,整个链表都被删除了你怎么知道的?
  • @appleapple 我调试了程序并在这一点上弄清楚了。
  • @笑只是一个注释,下次发布触发行为的代码,即minimal reproducible example,以便其他人可以更轻松地帮助您。

标签: c++ class linked-list


【解决方案1】:

您的代码似乎按预期工作,但您必须处理已删除节点为头部的特殊情况:

#include <iostream>

class Node
    {
    public:
        Node(std::string  n) {
            name = n;
        }
        std::string getName() const
        {
           return name;
        }
        Node* getLink() const
        {
           return link;
        }
        void setLink(Node *node)
        {
           link = node;
        }
    private:
        std::string name;
        Node* link;
    };
typedef Node* NodePtr;

void deleteOneNode(NodePtr& head, std::string valueToDelete)
{
    //Special case
    if (valueToDelete == head->getName()) {
        head = head->getLink(); 
        return;
     }

    NodePtr currentPtr = head, previousPtr = head;
    while (currentPtr != NULL && currentPtr->getName() != valueToDelete)
    {
        previousPtr = currentPtr;
        currentPtr = currentPtr->getLink();
    }
    if (currentPtr != NULL)
    {
        previousPtr->setLink(currentPtr->getLink());
        delete currentPtr; //afer this code run, the entire linked list is deleted**
    }
}

int main()
{
     Node * node1 = new Node("A");
     Node * node2 = new Node("B");
     Node * node3 = new Node("C");
     node1->setLink(node2);
     node2->setLink(node3);

    deleteOneNode(node1, "B");
    std::cout << node1->getLink()->getName() << "\n"; //==> "C"

    deleteOneNode(node1, "A");
    std::cout << node1->getName() << "\n"; //==> "C"
    
    return 0;                          
}

【讨论】:

  • 兄弟,你是对的。我撞了一个晚上的头。你救了我。非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-01
  • 1970-01-01
  • 2021-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多