如何解决在特定位置插入节点
我需要在链表的给定位置插入一个节点。 有什么更好的方法吗? 这是我的代码:
struct node
{
int data;
node* next;
};
void InsertNodeAtPosition(node *& first,int x,int position)
{
//0 based indexing
int i = 0;
node *q = new node;
q = first;
while (i != position - 1)
{
q = q->next;
i++;
}
node *t = new node;
t->data = x;
t->next = q->next;
q->next = t;
}
我已经对其进行了测试,并且可以正常工作。但是我想在进入下一章之前真正精通链接列表。谢谢!
解决方法
还有更好的方法吗?
当然,最好不要泄漏内存:
node *q = new node;
q = first;
关于算法本身:对于单链列表,将元素插入到特定位置的更好方法是将指针传递到前一个节点作为参数,而不是头部和位置。这样就无需进行线性搜索。但是对于给定的参数,您尝试的算法是最佳的。
关于类设计:更好的方法是为列表实现迭代器,并使用它们而不是指向节点的指针,以便可以使用标准算法。并遵循5的规则以符合RAII模式和容器概念。并使用模板来支持不同的数据类型。并支持使用自定义分配器,以便用户可以控制节点的分配方式。
对于更高级别的设计:使用单链接列表的更好方法是不执行任何操作,因为标准库已经提供了数据结构的实现:std::forward_list
。
由您编写的函数是错误的,具有内存泄漏和未定义的行为。
例如,首先为指针q
分配动态分配的内存的地址,然后为它分配指针first
的值。因此分配的内存地址丢失,并且无法释放内存。
node *q = new node;
q = first;
此外,通过引用传递给函数的指针first
在函数内永远不会改变。
在while循环中,您没有检查指针q
是否等于nullptr
while (i != position - 1)
{
q = q->next;
i++;
}
所以这句话
q = q->next;
调用未定义的行为。
如果position
等于0
,则条件
i != position - 1
将评估为true,并且您将再次获得未定义的行为。
可以通过以下方式编写函数
void InsertNodeAtPosition( node * &first,int x,size_t position )
{
node **current = &first;
while ( *current && position-- )
{
current = &( *current )->next;
}
*current = new node { x,*current };
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。