C ++:删除单链表中间的节点?

时间:2014-12-02 00:29:25

标签: c++ templates linked-list nodes

这是我的代码:

template<class L>
Node<L>* LinkedList<L>::DeleteNode(L toDelete)
{
        Node<L>* current;
        Node<L>* trail;

        if(head == NULL)
        {
                cout << "\n\nCannot delete from an empty list.\n\n";
        }
        else
        {
            if(head->next == NULL)
            {
                if(head->data == toDelete)
                {
                    current = head;
                    delete current;
                    head = current;
                    tail = current;
                    cout << "\nObject found. The list is now empty.\n";
                }
                else
                {
                    cout << "\nObject not found.\n";
                }
            }
            else
            {
                current = head;

                while(current->data != toDelete && current->next != NULL)
                {
                        trail = current;
                        current = current->next;
                }

                if(current->data == toDelete)
                {
                    if(current->next == NULL)
                    {
                        trail->next = NULL;
                        current = trail;
                    }
                    else
                    {
                        // having error here
                        trail->next = current->next;
                        current = trail;
                        delete trail;

                    }

                    cout << "\nNode found and deleted.\n";
                }
                else
                {
                    cout << "\nObject not found.\n";
                }
            }
        }

        return head;
}

我标记了我遇到问题的具体行(当尝试从中间删除节点时(当next不为null时))。我已尝试过该块的多种变体,但仍然没有。

非常感谢所有帮助!

2 个答案:

答案 0 :(得分:0)

在这个阶段,你只是简单地让错误的节点退出: trail正在保存应该删除的节点的最后一个节点。 试试这个:

{
trail->next = current->next;
delete current;
//you may want to add: current=trail->next; if you are planing to keep working with 
// the rest of the list
}

您还应该检查以下代码块:

if(current->next == NULL)
            {
                trail->next = NULL;
                current = trail;
            }

你实际上并没有在这里解决问题,它应该是:

if((current->next == NULL)
{
    trail->next = NULL;
    delete current;
}

答案 1 :(得分:0)

看起来你正在分配地址当前点,与路径点相同,然后释放该资源,我认为这不是意图。

现在你实际上正在拆分列表,因为你在删除跟踪之前重新分配当前指向跟踪(当你想要释放当前时,基于你的while循环指向你要删除的内容)

更有意义的是:

trail->next = current->next; delete current;

我不确定你的其他案例是如何按预期工作的......代码看起来很有趣。例如,在你的情况下它是列表的末尾你没有释放任何资源(但你刚刚删除了一些东西,为什么没有资源被释放?)在删除头部的情况下,你丢失了你的列表并使用当前的实现创建了内存泄漏。

所有这一切 - 这是一个良好的开端,但我会退后一步,为你的链表提供的接口提供有效的原型,并列出可能的边缘情况(例如删除头部)。