我的节点有一个整数值。我希望我的程序通过使用这样的值交换两个节点:
void reemplazarNodosConValores(int a,int b) {
node *antecedenteDelPrimero = antecedentePorValor(a);
node *antecedenteDelSegundo = antecedentePorValor(b);
node *primero = nodoPorValor(a);
node *segundo = nodoPorValor(b);
node *nextDelPrimero = siguienteNodo(primero);
node *nextDelSegundo = siguienteNodo(segundo);
antecedenteDelSegundo->next = primero;
primero->next = nextDelSegundo;
antecedenteDelPrimero->next = segundo;
segundo->next = nextDelPrimero;
}
如您所见,我创建了六个变量。两个节点。每个节点之前的节点。以及每个节点之后的节点。
然后,我进行交换。
但是,当我尝试打印节点时,交换似乎会产生无限循环。
我的回答基于这个答案:https://stackoverflow.com/a/1536011/555690
编辑:其他功能,请求:
node *antecedentePorValor(int x) {
node *resultado = NULL;
for (int i = 0; i < counter; ++i) {
resultado = siguienteNodo(resultado);
if (siguienteNodo(resultado)) {
if (siguienteNodo(resultado)->data == x) {
break;
}
}
}
return resultado;
}
node *nodoPorValor(int x) {
node *resultado = head;
for (int i = 1; i < counter; ++i) {
if (resultado->data == x) {
break;
}
resultado = resultado->next;
}
return resultado;
}
node *siguienteNodo(node *nodo) {
node *resultado;
if (nodo) {
resultado = nodo->next;
}else{
resultado = head;
}
return resultado;
}
答案 0 :(得分:2)
有几种情况需要注意
b
的节点紧跟在值为a
的节点之后,反之亦然a
或b
的节点是列表中的第一个节点a
或值为b
如果没有看到函数antecedentePorValor
和nodoPorValor
的代码,则无法说明案例2或3是否存在问题。案例#1有一个错误。
编辑:显示#1存在错误的原因,假设节点(a)指向节点(b),然后
void reemplazarNodosConValores(int a,int b) {
node *antecedenteDelPrimero = antecedentePorValor(a); // node preceding a
node *antecedenteDelSegundo = antecedentePorValor(b); // node preceding b (a)
node *primero = nodoPorValor(a); // node that contains a
node *segundo = nodoPorValor(b); // node that contains b
node *nextDelPrimero = siguienteNodo(primero); // node following a (b)
node *nextDelSegundo = siguienteNodo(segundo); // node following b
antecedenteDelSegundo->next = primero; // a->next = a
primero->next = nextDelSegundo; // a->next = node following b
antecedenteDelPrimero->next = segundo; // preva->next = b
segundo->next = nextDelPrimero; // b->next = b <<== b points to self!!
}
在评论中,我使用简写preva
表示antecedenteDelPrimero
,a
表示primero
,b
表示segundo
。