链接列表:在[索引未正确递增]的情况下查找要删除的节点索引的问题

时间:2018-04-04 05:51:49

标签: c++ for-loop linked-list increment

我正在创建一个链表程序,其中一个函数应该删除给定索引处的节点。

我的想法是在我希望删除的索引处的节点之前找到一个节点,然后将它的下一个指针设置为我想要删除的节点的 - > next 指针,因此“跳过”并将其从列表中删除。

目前我的for循环似乎不起作用。在for循环运行之后,temp-> data的值始终是列表中第二个节点的数据。

例如,使用节点列表

  

15   14   13   12   11   10(10是列表的开头)

如果我想在4的索引处删除。

temp->数据返回11,而不是14。

这是我的代码:

NODE * removeAt(NODE * pList, int index)
{
    NODE * temp = pList; 

    for (int i = 0; i < index - 1; i++)
    {
        temp = temp->next;
    }

    NODE * next = temp->next->next;
    temp->next = next;

    return temp;
}   

感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

首先,您有一个索引约定问题。如果你说你希望删除后的下一个是14,那就意味着你要删除数字13.但如果你从0开始就是3号。

你说“我的想法是在我希望删除的索引处的节点之前找到一个节点”。想象一下,你想删除起始节点(数据= 10),你的想法会在这里工作吗?在这种情况下,没有任何“一个之前”节点。关于最后一个。

之后就没有了下一个

此外,您需要检查各处的空指针。并且您必须销毁已删除的节点以避免内存泄漏。

您需要检查如何插入节点。开始真的是10吗?

我会像这样改进您的代码:

#include <iostream>

#include <vector>

using namespace std;

struct NODE
{
    int data;
    NODE * next;
};

NODE * removeAt(NODE * pList, int index)
{
    if (!pList)
        return nullptr;

    NODE * temp = pList;
    if (index == 0)
    {
        temp = pList->next;
        std::cout << "removing " << pList->data << endl;
        delete pList;
        return temp;
    }

        // after this loop temp points to the node before
    for (int i = 0; i < index -2; i++)
    {
        temp = temp->next;
        if (!temp || !temp->next)   // to guarantee both the-node-before and the-node-to-remove exist
            return nullptr;
    }

    NODE * next = temp->next->next;
    std::cout << "removing " << temp->next->data << endl;
    delete temp->next;
    temp->next = next;

    return next;
}

int main()
{
    std::vector<int> vec {15, 14, 13, 12, 11, 10};

    NODE * root = nullptr;
    for (const int v : vec)
    {
        std::cout << v << ' ' << endl;
        NODE * cur = new NODE;
        cur->data = v;
        cur->next = root;
        root = cur;
    }

    removeAt(root, 4);

    return 0;
}