我正在创建一个链表程序,其中一个函数应该删除给定索引处的节点。
我的想法是在我希望删除的索引处的节点之前找到一个节点,然后将它的下一个指针设置为我想要删除的节点的 - > 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;
}
感谢任何帮助!
答案 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;
}