从链表 C++ 中删除节点

Posted

技术标签:

【中文标题】从链表 C++ 中删除节点【英文标题】:Delete node from Linked List C++ 【发布时间】:2015-09-28 17:36:44 【问题描述】:

我正在研究从链表中删除节点的迭代删除函数,我认为代码应该可以正常工作。但是当我不能使用“删除”来删除列表的第一个节点时。 代码是: #包括 使用命名空间标准;

struct Node

    int data;
    Node* next;
;

Node* GetNewNode(int data)

    Node* newNode = new Node;
    newNode->data = data;
    newNode->next = NULL;
    return newNode;


Node* Insert(Node *root, int data)

    if (root == NULL)
    
        root = GetNewNode(data);

    
    else
        root->next = Insert(root->next, data);
    return root;


void Delete_k(Node *root, int k)


    int i = 0;
    Node* P = new Node;
    if (k == 1)
    
        P = root;
        root = root->next;
        delete P;

    
    else
    
        for (int i = 1; i <= k - 2; i++)
        
            root = root->next;
        
        root->next = root->next->next;
    


void Output(Node* root)

    if (root == NULL)
    
        root = root->next;
    
    while (root != NULL)
    
        cout << root->data << " ";
        root = root->next;
    


int main()

    int n, a, pos;
    Node* root = NULL;
    cout << "Input your list hear: ";
    cin >> n;
    while (n > 0)
    
        root = Insert(root, n);
        cin >> n;
    
    Output(root);
    cout << "\nDelete Pos?: ";
    cin >> pos;
    Delete_k(root, pos);
    Output(root);

我有这个问题

void Delete_k(Node *root, int k)


    int i = 0;
    Node* P = new Node;
    if (k == 1)
    
        P = root;
        root = root->next;
        delete P;

    
    else
    
        for (int i = 1; i <= k - 2; i++)
        
            root = root->next;
        
        root->next = root->next->next;
    

【问题讨论】:

贴出不能按预期工作的测试代码 @JamesWierzba 是的,如果您选择 1 删除,此代码将不起作用。 当您使用调试器时,哪些语句会给您带来问题? 在输出中:if (root == NULL) root = root-&gt;next; 如果没有根,则获取不存在的根之后的下一项。几乎肯定不是你想做的。 Delete_K 内存泄漏。 【参考方案1】:

问题:

void Delete_k(Node *root, int k)

根的值是通过引用传递的,但指向它的指针不是。

结果:Delete_k 的根是 main 的根的副本。 Delete_K 的根被重新指向和删除。 Main 的根现在指向垃圾内存。结束游戏程序。

解决办法:

提供对根指针的引用,这样它就不会被复制。

void Delete_k(Node *& root, int k)

或者从 Delete_k 返回根目录。

Node * Delete_k(Node * root, int k)

    //existing code
    return root;

【讨论】:

感谢您给我一个完美的解决方案。我的问题解决了。

以上是关于从链表 C++ 中删除节点的主要内容,如果未能解决你的问题,请参考以下文章

从链表中删除一个节点

javascript中的链表结构—从链表中删除元素

从链表中删除节点(递归)

从链表中删除总和值为0的连续节点

从链表中删除用户选择的节点,用 c 中另一个列表中的节点替换它们

递归地从链表中删除数据