链接列表:在 [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;
}
我正在创建一个链表程序,其中一个函数应该删除给定索引处的节点。
我的想法是将第一个节点定位在我希望删除的索引处的节点之前,然后将它的下一个指针设置为我希望的节点的 ->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;
}