【问题标题】:Linked List: issues finding index of node to remove at [index not incrementing correctly]链表:在 [索引未正确递增] 处查找要删除的节点索引时出现问题
【发布时间】:2018-04-04 05:51:49
【问题描述】:

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


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


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

例如,节点列表

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

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

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

感谢任何帮助!

【问题讨论】:

  • 与您的(当前)问题无关,但您的代码中有一些致命缺陷,所有缺陷都缺少空指针检查。如果用户提供的索引超出范围怎么办?如果没有temp-&gt;next怎么办?
  • 您确定 10 是列表的开头而不是 15 吗?这也可能会爆炸:NODE * next = temp-&gt;next-&gt;next; 如果您要删除最后一个节点。 (或者如果索引>列表大小,循环内部可能会爆炸)
  • @AaronHolland 你是对的。我把名单的头/尾颠倒了,我应该意识到的。是的,我必须添加一个例外情况。感谢您的帮助!
  • 从单链表中删除项目的有用技巧:stackoverflow.com/questions/12914917/… This linked answer 非常详细。

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


【解决方案1】:

首先,您有一个索引约定问题。如果您说您希望 the-next-after-removed 为 14,则表示您要删除数字 13。但如果您从 0 开始,则它是数字 3。

您说“我的想法是在我希望删除的索引处的节点之前定位节点”。想象一下,你想删除起始节点(data=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;
}

【讨论】:

  • 您好,感谢您的回答。您的大多数更改看起来都不错,(感谢您提醒我查找内存泄漏),但我发现了一个问题。在 if (index == 0) 的情况下,这会从索引 1 中删除节点,而不是 0。关于为什么的任何想法?
  • 我在测试中看到的,它删除了索引 0,它的 data=10。
  • 然后它返回一个指向 11 的指针。尝试调用 removeAt(root, 0);
猜你喜欢
  • 2010-12-23
  • 1970-01-01
  • 2016-03-17
  • 1970-01-01
  • 1970-01-01
  • 2010-09-27
  • 1970-01-01
  • 1970-01-01
  • 2020-01-26
相关资源
最近更新 更多