简介:
循环链表是另一种形式的链式存贮结构。它的特点是表中最后一个结点的指针域指向头结点,整个链表形成一个环。
图示:
C语法实现:
#include<bits/stdc++.h>
using namespace std;
typedef struct Node{
int data;
Node *prior;
Node *next;
}*List;
List tail = new Node;
void init_list(List &hed){
hed = new Node;
hed->next = tail;
tail->prior = hed;
hed->prior = tail;
tail->next = hed;
}
void insert_head_node(List &hed, List n){
n->next = hed->next;
hed->next->prior = n;
n->prior = hed;
hed->next = n;
}
void insert_tail_node(List n){
tail->prior->next = n;
n->prior = tail->prior;
n->next = tail;
tail->prior = n;
}
void insert_head_value(List &hed, int e){
List temp = new Node;
temp->data = e;
insert_head_node(hed, temp);
}
void insert_tail_value(List &hed, int e){
List temp = new Node;
temp->data = e;
insert_tail_node(temp);
}
void print_list_head(List &hed){
for(List i = hed->next; i != hed && i != tail; i = i->next)
cout << i->data << " ";
}
void print_list_tail(List &hed){
for(List i = tail->prior; i != tail && i != hed; i = i->prior)
cout << i->data << " ";
}
int main(){
List hed;
init_list(hed);
//头插
for(int i = 1; i < 10; i++)
insert_head_value(hed, rand()%100);
print_list_head(hed);
cout << endl;
print_list_tail(hed);
cout << endl;
//尾插
for(int i = 1; i < 10; i++)
insert_tail_value(hed, rand()%100);
print_list_head(hed);
cout << endl;
print_list_tail(hed);
return 0;
}
标题的双节点意思是,通过两个标志(头尾节点),将整个链表串接起来。循环链表也可以通过单一节点串接,单节点循环链表请参考另一篇博客。
遍历链表的时候不再是判断当前节点是否指向NULL了,判断的依据应该是是否指向了头尾标志节点。
循环链表同样具有双向链表的特性,具体可参考双向链表篇博客。