关注码农话题
做一个实实在在的内行人

循环链表

循环链表是链接的列表,其中第一个元素指向最后一个元素和最后一个元素指向第一个元素的链接变型。单向链表和双向链表都可以做成作为循环链表。

单链表循环

Singly Linked List as Circular Linked List

双向链表循环

Doubly Linked List as Circular Linked List

按照如上所示的插图,下面是要考虑的重要问题。

  • 最后一个链接的下一个点到列表的第一个链接单独使用,在单/双向链表两种情况都可以使用。
  • 在双向链表中,第一个链接的前一个指向最后列表的最后一个链接。

基本操作

下面是一个循环列表支持的重要操作。

  • 插入 − 在列表的开头插入的元素。
  • 删除 − 在列表的开头删除元素。
  • 显示 − 显示列表。

长度操作

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

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

入职你的梦想 VS 变现你的技术

IT面试宝典码农市场