圆形链接列表是链接列表的变体,其中第一个元素指向最后一个元素,最后一个元素指向第一个元素.单链表和双链表都可以制成循环链表.
单链表作为循环
在单链表中,最后一个节点的下一个指针指向第一个节点.
双向链接列表为循环
在双向链表中,最后一个节点的下一个指针指向第一个节点,第一个节点的前一个指针指向最后一个节点在两个方向上制作圆形.
根据上图,以下是需要考虑的重点.
最后一个链接的下一个在单独的两种情况下都指向列表的第一个链接作为双向链表.
如果是双向链表,第一个链接的前一个指向列表的最后一个.
基本操作
以下是循环列表支持的重要操作.
insert : 在列表的开头插入一个元素.
删除 : 删除列表开头的元素.
显示 : 显示列表.
插入操作
以下代码演示了循环链接中的插入操作基于单个链表的列表.
示例
//insert link at the first locationvoid insertFirst(int key, int data) { //create a link struct node *link = (struct node*) malloc(sizeof(struct node)); link->key = key; link->data= data; if (isEmpty()) { head = link; head->next = head; } else { //point it to old first node link->next = head; //point first to new first node head = link; } }
删除操作
以下代码演示了循环中的删除操作基于单链表的链表.
//delete first itemstruct node * deleteFirst() { //save reference to first link struct node *tempLink = head; if(head->next == head) { head = NULL; return tempLink; } //mark next to first link as first head = head->next; //return the deleted link return tempLink;}
显示列表操作
以下代码演示了循环链表中的显示列表操作.
//display the listvoid printList() { struct node *ptr = head; printf("\n[ "); //start from the beginning if(head != NULL) { while(ptr->next != ptr) { printf("(%d,%d) ",ptr->key,ptr->data); ptr = ptr->next; } } printf(" ]");}
要了解它在C编程语言中的实现.