我有一个基本的链表问题,我试图在下面解决 . 我会很感激我的方法,算法的正确性(甚至编码风格)的任何输入 . 该问题需要一个函数来删除循环链表中所有出现的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;
}
2 回答
delete node;
应为delete del;
.另外,使用
Node* node
作为参数,而不是Node* &node
,这将防止非左值传入 .附:在结构定义后忘记分号? :)
如果不遵循您的所有逻辑,我一眼就看出这段代码无法运行 .
您正在检查输入列表是否为空,这是您的代码返回
NULL
的唯一情况 . 但是如果传递一个必须删除所有元素的列表会发生什么?这个问题也有一个微妙之处 . 要检查是否已完成循环列表,您需要与第一个地址进行比较,以查看是否已链接回到开头 . 但是,如果已删除此元素,则按C标准删除 not even allowed to use its address in a comparison .
为了避免对要删除的元素进行两次传递,一个可能的技巧是在开始迭代时"break the loop",这样您就可以检查
NULL
而不是检查起始节点的地址 .