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