Come unire insieme due elenchi circolari doppiamente collegati in O (1) Tempo?

cs.stackexchange https://cs.stackexchange.com/questions/123926

  •  29-09-2020
  •  | 
  •  

Domanda

Sto implementazione di un heap fibonacci, in cui gli elenchi vengono memorizzati come elenchi circolari doppiamente collegati.Quello che sto cercando di fare viene dato un puntatore a un nodo casuale in un elenco collegato, e un nodo casuale in un altro, voglio unirli insieme in o (1) tempo.Ho provato a disegnarlo, ma non riuscivo a capire come farlo.Ecco la mia prima idea, in pseudocodice:

union(Node one, Node two) {
    if other = nil
        return

    p1 = one
    p2 = one.right
    p3 = two
    p4 = two.right

    p1.right = p4
    p4.left = p1
    p2.right = p3
    p3.left = p2
}
.

Ogni Node ha un attributo left e right, che memorizza il nodo a sinistra ea destra, rispettivamente.Tuttavia, questo non ha funzionato.Qualcuno può capire come unire insieme due elenchi collegati?

È stato utile?

Soluzione

Non è necessario utilizzare variabili temporanee.Vedi la seguente immagine e la pseudocodice associata sottostante.Vuoi riassumere i puntatori grigi alla loro controparte colorata.Devi solo stare attento con l'ordine delle istruzioni.

 Lista doppiamente collegata Unisci

one.right.left = two.left;  //red
two.left.right = one.right; //blue

one.right = two; //green
two.left = one;  //purple
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a cs.stackexchange
scroll top