从单链表中删除特定值?

时间:2016-05-05 19:50:00

标签: c++ linked-list

如果数据与特定值匹配,我一直在尝试删除节点。

这是我的删除值方法:

void del_value(int data)
{
    Node *temp = head;

    int i = 0;

    while(temp!=NULL)
    {
        if(temp->data == data)
        {
            del_index(i);
            i--; // Since the nodes count will be reduced after deleting, reducing the index by one.
        }
        i++;

        temp = temp->next;
    }
}

这是我的del_index方法(工作正常):

    int getCount()
{
    int i = -1;

    Node *temp = head;

    while(temp!=NULL)
    {
        temp = temp->next;
        i++;
    }

    return i;
}

void del_index(int pos)
{
    int count = getCount();

    if(pos == 0)
    {
        del_start();
    }
    else if(pos == count)
    {
        del_last();
    }
    else if(pos<0 || pos>count)
    {
        cout<<"Out of range"<<endl;
        return;
    }
    else
    {
        int i = 1;

        Node *temp = head;

        while(i<pos)
        {
            temp = temp->next;
            i++;
        }

        Node *toDel = temp->next;
        Node *forward = toDel->next;

        temp->next = forward;
        delete toDel;
    }
}

这是我的主要方法:

int main()
{
    Mylist l;

    l.add_start(4);
    l.add_start(4);
    l.add_start(4);

    l.del_value(4);

    l.show();
}

但它在内部循环中达到del_value方法时会卡住。知道我在哪里错过了吗?

更新:(添加了del_first和del_last方法

void del_start()
{
    if(head == NULL)
    {
        cout<<"List is empty"<<endl;
        return;
    }
    else
    {
        Node *temp = head;
        head = head->next;
        delete temp;
    }
}

void del_last()
{
    if(head == NULL)
    {
        cout<<"List is empty"<<endl;
        return;
    }
    else
    {
        Node *temp = head;

        while(temp->next != NULL)
        {
            tail = temp;
            temp = temp->next;
        }

        tail->next = NULL;
        delete temp;
    }
}

1 个答案:

答案 0 :(得分:1)

你的del_value方法不起作用,因为你删除了临时指向的对象&#39; temp&#39;然后你取消引用它(使用&#34; temp = temp-&gt; next&#34;)。

对于您的示例代码,我会缓存&#39; next&#39;条件之前的值,例如:

Node *next = temp->next;
if(temp->data == data)
{
    del_index(i);
    i--;
}

i++;
temp = next;

我假设您为了练习目的而这样做,但我会添加以下建议:

我不会在这里调用del_index,但在del_value方法中删除内联节点。因为你有必要的指针,能够删除它。 del_index必须再次遍历您的列表。

我还建议在stl中使用容器,而不是自己滚动容器,以避免遇到这样的问题。