算法5.双向循环链表 算法5.双向循环链表// 05_双向循环链表.cpp : 此文件包含 main 函数。程序执行将在此处开始并结束。//#includeiostreamusingnamespacestd;// 定义双向链表的节点类型structNode{Node(intdata0):data_(data),next_(nullptr),pre_(nullptr){}intdata_;// 数据域Node*next_;// 指向下一个节点Node*pre_;// 指向前一个节点};// 双向循环链表classDoubleCircleLink{public:DoubleCircleLink(){head_newNode();head_-next_head_;head_-pre_head_;}~DoubleCircleLink(){Node*phead_-next_;while(p!head_){head_-next_p-next_;p-next_-pre_head_;deletep;phead_-next_;// 让p重新指向第一个节点进行删除}deletehead_;head_nullptr;}public:// 头插法 O(1)voidInsertHead(intval){Node*nodenewNode(val);node-next_head_-next_;node-pre_head_;head_-next_-pre_node;head_-next_node;}// 尾插法 O(1)voidInsertTail(intval){Node*phead_-pre_;// p-尾节点Node*nodenewNode(val);node-pre_p;p-next_node;node-next_head_;head_-pre_node;}// 节点删除voidRemove(intval){Node*phead_-next_;while(p!head_){if(p-data_val){// 删除p指向的节点p-pre_-next_p-next_;p-next_-pre_p-pre_;deletep;return;}else{pp-next_;}}}// 节点搜索boolFind(intval){Node*phead_-next_;while(p!head_){if(p-data_val){returntrue;}else{pp-next_;}}returnfalse;}// 链表节点输出voidShow(){Node*phead_-next_;while(p!head_){coutp-data_ ;pp-next_;}coutendl;}private:Node*head_;// 指向头节点};intmain(){DoubleCircleLink dlink;dlink.InsertHead(100);dlink.InsertTail(20);dlink.InsertTail(12);dlink.InsertTail(78);dlink.InsertTail(32);dlink.InsertTail(7);dlink.InsertTail(90);dlink.Show();dlink.InsertHead(200);dlink.Show();dlink.Remove(200);dlink.Show();dlink.Remove(90);dlink.Show();dlink.Remove(78);dlink.Show();}