Ich versuche, eine priority queue
mit einem singly linked list
zu bauen. Die Idee ist, dass ich immer das Minimum int x
in meinem Node* head
speichern. Wenn die Methode deleteMin()
aufgerufen wird. Es sollte den Minimalwert (head->x
) zurückgeben und den Kopf auf den nächstniedrigeren Wert in der Liste aktualisieren.C++ Neuaufbau Singly Linked List Links
Das Problem, das ich zu haben scheint, ist die Aktualisierung der Links, sobald eine neue lowestNode
gefunden wurde.
SLList.hpp
const int deleteMin() {
int returnVal = this->head->x;
// we need to find the next lowest in the list and update our head, then relink the list.
// first update our head to the next of the current head
this->head = this->head->next;
cout << "head now: " << this->head->x << endl;
// iterate through our nodes searching for a smaller value
Node* currentNode = this->head;
Node* nextNode = NULL;
Node* lowestNode = NULL;
Node* prevNode = NULL;
// Node* prevHead = NULL;
// Node* nextHead = NULL;
while(currentNode != NULL) {
if (currentNode->next->x < this->head->x) {
nextNode = currentNode->next->next;
cout << "nextNode: " << nextNode->x << endl;
lowestNode = currentNode->next;
cout << "lowestNode: " << lowestNode->x << endl;
prevNode = currentNode;
cout << "prevNode: " << prevNode->x << endl;
// prevHead = this->head;
// cout << "prevHead: " << prevHead->x << endl;
// nextHead = this->head->next;
// cout << "nextHead: " << nextHead->x << endl;
// update links
lowestNode->next = this->head->next;
currentNode = this->head;
currentNode->next = nextNode;
this->head = lowestNode;
} else {
currentNode = currentNode->next;
}
}
// decrement the size
this->_size--;
// return the minVal
return returnVal;
}
wie die Liste * gebaut *? Wenn es von Anfang an so sortiert gehalten wurde, scheint das eine Menge Arbeit für das zu sein, was ein einfacher Kopf-Pop sein sollte. Und ich bin neugierig auf Ihr potentielles Verhalten, wenn die Liste * leer * ist (d. H. 'Head' ist nullptr) oder einen einzelnen Eintrag hat (wo Dinge wie' head-> next-> x' potentielles Doom buchstabieren). – WhozCraig
Die Liste ist nicht sortiert, soll aber dieselben Eigenschaften wie eine Prioritätswarteschlange implementieren. Dies bedeutet, dass der "Kopf" meiner Liste priorisiert ist, um immer den niedrigsten Wert für "int x" zu enthalten, der Rest der Liste bleibt unsortiert. – SuperVeetz
Also ... verschiebst du die Sortieraktion eher in die Pop-Zeit als in die Push-Zeit? Wie auch immer, die Kosten sind immer noch da und unvermeidlich. Ich versuche nur an den Fall zu denken, in dem Listen-Scannen zur Pop-Zeit vorteilhafter ist als zur Push-Zeit für eine generische verknüpfte Liste. Ungeachtet. Es dreht sich alles um die Zeiger, die auf die Knoten zeigen; Pointer-to-Pointer-Arbeit sollte das einfacher machen, würde ich denken. – WhozCraig