循环链表算法
圆形链接列表是链接列表的变体,其中第一个元素指向最后一个元素,最后一个元素指向第一个元素。单链表和双链表都可以制成循环链表。
单链表作为通函
在单链表中,最后一个节点的下一个指针指向第一个节点。
双重挂钩清单为通函
在双向链表中,最后一个节点的下一个指针指向第一个节点,第一个节点的前一个指针指向最后一个节点,在两个方向上形成圆形。
根据以上说明,以下是要考虑的重点。
最后一个链接的下一个链接指向列表的第一个链接,无论是单链还是双链表。
在双链表的情况下,第一个链接的前一个指向列表的最后一个。
基本操作
以下是循环列表支持的重要操作。
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(" ]"); }