我有一个基本的链表问题,我试图解决下面。我将感谢任何输入我的方法,算法的正确性(甚至编码风格)。该问题调用一个函数,该函数删除循环链表中出现的所有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
而不是检查起始节点的地址。