使用 Java 的 DSA - 循环链接列表
循环链接列表基础知识
循环链接列表是链接列表的一种变体,其中第一个元素指向最后一个元素,最后一个元素指向第一个元素。单链表和双链表都可以制成循环链表
单链表作为循环

双链表作为循环

根据上图,以下是需要考虑的重要点。
无论是单链表还是双链表,Last Link'next 都指向列表的第一个链接列表。
如果是双向链表,第一个链接的 prev 指向列表的最后一个。
基本操作
以下是循环列表支持的重要操作。
插入 − 在列表开头插入一个元素。
删除 − 从列表开头插入一个元素。
显示 −显示列表。
长度操作
以下代码演示了基于单链表的循环链表中的插入操作。
//在第一个位置插入链接 public void insertFirst(int key, int data){ //创建链接 Link link = new Link(key,data); if (isEmpty()) { first = link; first.next = first; } else{ //将其指向旧的第一个节点 link.next = first; //将 first 指向新的第一个节点 first = link; } }
删除操作
以下代码演示了基于单链表的循环链表中的删除操作。
//删除第一个位置的链接 public Link deleteFirst(){ //保存对第一个链接的引用 Link tempLink = first; //如果只有一个链接 if(first.next == null){ last = null; }else { first.next.prev = null; } first = first.next; //返回已删除的链接 return tempLink; }
显示列表操作
以下代码演示了循环链表中的显示列表操作。
public void display(){ //从头开始 Link current = first; //导航到列表末尾 System.out.print("[ "); if(first != null){ while(current.next != current){ //打印数据 current.display(); //移动到下一个项目 current = current.next; System.out.print(" "); } } System.out.print(" ]"); }
演示
Link.java
package com.tutorialspoint.list; public class CircularLinkedList { //此链接始终指向第一个链接 private Link first; // 创建一个空的链接列表 public CircularLinkedList(){ first = null; } public boolean isEmpty(){ return first == null; } public int length(){ int length = 0; //如果列表为空 if(first == null){ return 0; } Link current = first.next; while(current != first){ length++; current = current.next; } return length; } //在第一个位置插入链接 public void insertFirst(int key, int data){ //创建链接 Link link = new Link(key,data); if (isEmpty()) { first = link; first.next = first; } else{ //将其指向旧的第一个节点 link.next = first; //将 first 指向新的第一个节点 first = link; } } //delete first item public Link deleteFirst(){ //保存对第一个链接的引用 Link tempLink = first; if(first.next == first){ first = null; return tempLink; } //将第一个链接旁边的标记为第一个 first = first.next; //返回删除的链接 return tempLink; } public void display(){ //从头开始 Link current = first; //导航到列表末尾 System.out.print("[ "); if(first != null){ while(current.next != current){ //打印数据 current.display(); //移动到下一个项目 current = current.next; System.out.print(" "); } } System.out.print(" ]"); } }
DoublyLinkedListDemo.java
package com.tutorialspoint.list; public class CircularLinkedListDemo { public static void main(String args[]){ CircularLinkedList list = new CircularLinkedList(); list.insertFirst(1, 10); list.insertFirst(2, 20); list.insertFirst(3, 30); list.insertFirst(4, 1); list.insertFirst(5, 40); list.insertFirst(6, 56); System.out.print("原始列表: "); list.display(); System.out.println(""); while(!list.isEmpty()){ Link temp = list.deleteFirst(); System.out.print("删除的值:"); temp.display(); System.out.println(""); } System.out.print("删除所有项目后的列表: "); list.display(); System.out.println(""); } }
如果我们编译并运行上述程序,则会产生以下结果 −
原始列表: [ {6,56} {5,40} {4,1} {3,30} {2,20} ] 删除的值:{6,56} 删除的值:{5,40} 删除的值:{4,1} 删除的值:{3,30} 删除的值:{2,20} 删除的值:{1,10} 删除所有项目后的列表: [ ]