起因是斐波那契堆的析构函数问题,于是有了这个双向循环链表的析构函数。由于此时我们不要维护链表结构所以只需要全部删除即可,实际时间复杂度 O(n), 均摊复杂度 O(1)
//EFFECT: delete Node recursively, //Time ComplexityO: (n) since we visit each node only once template<typename TYPE, typename COMP> void fib_heap<TYPE, COMP> ::all_delete(Node *now) { if(now == nullptr)return; all_delete(now->son); if(now->right == now) // delete from left to right { delete now; return ; } Node* next=now->right; now->left->right= now->left; //create a half-self-circle now->right->left= now->right; // and cut off the circle; all_delete(next); delete now; }
思路为创建半自环,这个方法可以减少需要的判断语句,初始化时,当循环链表中只有一个元素时,左右sibling都为其自己。