数据结构 - 循环链表

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

单链表作为循环

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

单链表作为循环链接列表

双向链接列表为循环

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

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

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

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

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

基本操作

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

  • insert : 在列表的开头插入一个元素.

  • 删除 : 删除列表开头的元素.

  • 显示 : 显示列表.

插入操作

以下代码演示了循环链接中的插入操作基于单个链表的列表.

示例

//insert link at the first location
void 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 item
struct 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 list
void 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编程语言中的实现.