使用 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}
删除所有项目后的列表: [  ]