删除循环链表中的节点
Deleting a node in circular linked list
我有一个基本的链表问题,我试图解决下面。我将感谢任何输入我的方法,算法的正确性(甚至编码风格)。该问题调用一个函数,该函数删除循环链表中出现的所有int,并返回列表中的任何节点或NULL(当列表为NULL时)。
这里是我目前为止的一些c++代码:
struct Node{
Node* next;
int data;
};
Node* deleteNode(Node* &node, int num){
if(!node){
return NULL;
}
Node* given = node;
Node* del;
while(node->next != given){
if(node->next->data == num){
del = node->next;
node->next = node->next->next;
delete del;
}
node = node->next;
}
//Check if the first node needs to be deleted, with variable node pointing to last element
if(given->data == num){
node->next = given->next;
delete given;
}
return node;
}
delete node;
应为delete del;
另外,使用Node* node
作为参数,而不是Node* &node
,这将防止非左值传入。
注。忘记了结构定义后的分号?:)
如果不遵循你所有的逻辑,我一眼就能看出这段代码不能工作。
您正在检查输入列表是否为空,这是您的代码返回NULL
的唯一情况。但是,如果传递给您一个必须删除所有元素的列表,会发生什么情况呢?
这个问题也有一个微妙之处。为了检查你是否完成了一个循环列表,你需要与第一个地址进行比较,看看你是否被链接回了起点。但是,如果该元素已经被删除,那么根据c++标准,甚至不允许在比较中使用其地址。
为了避免两次遍历要删除的元素,一个可能的技巧是在开始迭代时"打破循环",这样您就可以检查NULL
而不是检查起始节点的地址。
相关文章:
- 使用std::list创建循环链表
- 循环链表:无限循环
- 打印循环链表
- 将二叉树的节点插入链表 (C++)
- C++循环链表删除,计数从下一个节点开始
- C++ 循环链表的递归基本情况
- 循环链表的内存错误:未分配正在释放的指针
- 返回指向循环链表某个点的指针
- 将节点插入链表只会转到开头或结尾
- 节点和链表问题
- 按排序顺序将节点插入链表
- 在 for 循环(链表)中删除两次后,变量不可用
- 尝试拆分循环链表.显示输出但崩溃.在 IDEone 中显示运行时错误
- 如何打印出双向循环链表
- 循环队列和循环链表
- 类似STL的列表由带节点的链表组成
- 给定一个二叉树,设计一个算法,创建每个深度的所有节点的链表
- 获取单个非循环链表中指针后面节点的值
- 删除循环链表中的节点
- 循环链表的循环开始节点