开发手册 欢迎您!
软件开发者资料库

数据结构 - 循环链表

数据结构和算法循环链接列表 - 使用c,C ++和Java学习数据结构和算法,从简单和简单的步骤开始,从基本到高级概念,包括概述,环境设置,算法,渐近分析,贪婪算法,分而治之,动态编程,数据结构,数组,链表,双链表,循环列表,堆栈,解析表达式,队列,优先级队列,线性,二进制,插值搜索,树,树遍历,二叉搜索树,B +,AVL,跨越,河内塔,哈希表,堆,图,深度,广度第一遍历,搜索技术,排序技术,排序算法,泡沫,合并排序算法,插入,选择,壳,快速排序,递归,斐波那契系列。

圆形链接列表是链接列表的变体,其中第一个元素指向最后一个元素,最后一个元素指向第一个元素.单链表和双链表都可以制成循环链表.

单链表作为循环

在单链表中,最后一个节点的下一个指针指向第一个节点.

单链表作为循环链接列表

双向链接列表为循环

在双向链表中,最后一个节点的下一个指针指向第一个节点,第一个节点的前一个指针指向最后一个节点在两个方向上制作圆形.

双重链接列表作为循环链接列表

根据上图,以下是需要考虑的重点.

  • 最后一个链接的下一个在单独的两种情况下都指向列表的第一个链接作为双向链表.

  • 如果是双向链表,第一个链接的前一个指向列表的最后一个.

基本操作

以下是循环列表支持的重要操作.

  • 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编程语言中的实现.