交换单链接列表节点会创建无限循环

时间:2012-10-07 02:42:12

标签: c++ linked-list

我的节点有一个整数值。我希望我的程序通过使用这样的值交换两个节点:

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;
}

1 个答案:

答案 0 :(得分:2)

有几种情况需要注意

  1. 值为b的节点紧跟在值为a的节点之后,反之亦然
  2. 值为ab的节点是列表中的第一个节点
  3. 有多个节点的值为a或值为b
  4. 如果没有看到函数antecedentePorValornodoPorValor的代码,则无法说明案例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表示antecedenteDelPrimeroa表示primerob表示segundo