これを行う簡単な方法の 1 つは、次の 3 段階のプロセスを使用することです。
- リストが通常の二重リンク リストになるように、循環リンクを解除します。
- 双方向にリンクされたリストを反復処理し、各ツリーを処理します。前述のように、反復中に各ノードの前方ポインターと次ポインターが変更される可能性があるため、これは注意が必要です。
- サイクルを閉じます。
各ステップの実行方法は次のとおりです。
循環リンクを解除します。
rootList->prev->next = NULL;
rootList->prev = NULL;
二重にリンクされたリストを反復処理します。
Node* current = rootList;
while (current != NULL) {
/* Cache the next node to visit so that even if the list changes, we can still
* remember where to go next.
*/
Node* next = current->next;
/* ... main Fibonacci heap logic ... */
current = next;
}
二重リンク リストを修復します。
Node* curr = rootList;
if (curr != NULL) { // If list is empty, no processing necessary.
while (curr->next != NULL) {
curr = curr->next;
}
curr->next = rootList;
rootList->prev = curr;
}
お役に立てれば!