数据结构和算法循环链表


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

单链表作为通函

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

单链表作为循环链表

双重挂钩清单为通函

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

双链表作为循环链表

根据以上说明,以下是要考虑的重点。

  • 最后一个链接的下一个链接指向列表的第一个链接,无论是单链还是双链表。

  • 在双链表的情况下,第一个链接的前一个指向列表的最后一个。

基本操作

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

  • insert - 在列表的开头插入一个元素。

  • delete - 从列表的开头删除元素。

  • display - 显示列表。

插入操作

下面的代码演示了基于单个链表的循环链表中的插入操作。

//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(" ]");
}