链接列表:在 [index not incrementing correctly] 处查找要删除的节点索引时出现问题

Linked List: issues finding index of node to remove at [index not incrementing correctly]

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


我的想法是将第一个节点定位在我希望删除的索引处的节点之前,然后将它的下一个指针设置为我希望的节点的 ->next 指针删除,因此 "skipping" 它并将其从列表中删除。


目前我的 for 循环似乎没有工作。 for循环有运行后,temp->data的值始终是链表中第二个节点的数据。

例如,节点列表

15 14 13 12 11 10 (10 being the start of the list)

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

temp->data returns 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;
}   

感谢任何帮助!

首先,您遇到了索引约定问题。如果你说你期望 the-next-after-removed 是 14,那意味着你想删除数字 13。但是如果你从 0 开始,它是一个数字 3。

你说"My idea is to locate the node one before the node at the index I wish to remove"。假设你想移除起始节点(data=10),你的想法在这里行得通吗?在这种情况下没有任何 "one before" 节点。最后一个也一样。不会有the-next-after-removed.

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

并且您需要检查如何插入节点。一开始真的是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;
}