简介
循环单链表 是在在单链表的基础上,用最后的一个结点的指针域指向头结点形成的。因此它在逻辑上是一个环形结构。
要点:1、遍历结束的标志是 p == 【头结点地址】,而不是p==NULL
2、表为空的判断标志是: if( head->next == head )
3、在单循环链表中,从任一结点出发都可访问到表中所有结点
循环链表一般还使用尾指针rear保存最后一个结点的地址,因为使用尾指针既可以快速找到 最后一个结点,也可以快速找到头结点。
简单的代码实现
#include<iostream> #include<cstdlib> #include<stdexcept> using namespace std; struct ListNode { int element; ListNode* next; ListNode(int e=0,ListNode* nxt=0):element(e),next(nxt) { } }; class CircleList { private: ListNode headNode; //头结点 ListNode* p_rear; //尾结点指针 int size; //表长度 public: CircleList():headNode(0,0),p_rear(0),size(0) { p_rear = &headNode; //尾结点指针初始化时也保存头结点的地址 headNode.next = &headNode; //形成环 } ~CircleList() { ListNode * p = headNode.next; ListNode *t ; while( p!= &headNode ) { t = p; p = p->next; delete t; } } void append(int e) { ListNode *new_node = new ListNode(e,&headNode); //新结点创建 ,新结点的next指向头结点。 p_rear->next = new_node; p_rear = new_node; size++; } void show()const { ListNode *p = headNode.next; cout<<'['; while(p!=&headNode) { if(p!=headNode.next) cout<<','; cout<<p->element; p = p->next; } cout<<']'; } }; int main() { CircleList clist; clist.append(12); clist.append(13); clist.append(14); clist.append(15); clist.append(16); clist.show(); }