Java数据结构与算法学习之循环链表

Java数据结构与算法学习之循环链表

本文将详细介绍Java数据结构中的一种链表类型——循环链表,并讲解如何使用Java实现循环链表。同时,本文也提供了两个示例,方便读者更好地理解和运用循环链表。

什么是循环链表

循环链表是一种链表,它与单向链表和双向链表不同之处在于它的最后一个结点指向第一个结点。这就形成了一个循环链,因此称之为循环链表。

如何实现循环链表

在Java中,我们可以通过定义一个结点类来实现循环链表。具体的代码如下:

public class Node {
    public int data; // 数据域
    public Node next; // 指针域(指向下一个结点)

    public Node(int data) {
        this.data = data;
        this.next = null;
    }
}

同时,我们也需要创建一个链表类,用于管理整个循环链表。链表类的定义如下:

public class CircularLinkedList {
    public Node head; // 头结点

    public CircularLinkedList() {
        this.head = null;
    }

    // 插入新的结点
    public void insert(int data) {
        Node newNode = new Node(data);
        if (head == null) {
            head = newNode;
            newNode.next = head;
        } else {
            Node current = head;
            while (current.next != head) {
                current = current.next;
            }
            current.next = newNode;
            newNode.next = head;
        }
    }

    // 删除指定数据的结点
    public void delete(int data) {
        if (head == null) {
            System.out.println("链表为空!");
            return;
        } else if (head.data == data) {
            head = head.next;
        } else {
            Node current = head;
            while (current.next != head) {
                if (current.next.data == data) {
                    current.next = current.next.next;
                    return;
                }
                current = current.next;
            }
            System.out.println("未找到指定数据的结点!");
        }
    }

    // 输出整个链表
    public void print() {
        if (head == null) {
            System.out.println("链表为空!");
        } else {
            Node current = head;
            do {
                System.out.print(current.data + " ");
                current = current.next;
            } while (current != head);
            System.out.println();
        }
    }
}

在这个链表类中,提供了三个方法:insert()、delete()和print()。分别用于插入新的结点、删除指定数据的结点和输出整个链表。

如何运用循环链表

循环链表可以用于很多场合,例如模拟环形动物队列、文件系统的循环链表等等。下面提供两个示例:

1.环形动物队列

在一个动物园中有10只猴子,现在要求按照顺序排名,从1到10。其中如果第一只猴子数到5,那么就离开队列,依次类推,直到只剩下最后一只猴子。那么我们可以利用循环链表来模拟这个过程。

public static void monkeyQueue() {
    CircularLinkedList list = new CircularLinkedList();
    for (int i = 1; i <= 10; i++) {
        list.insert(i);
    }
    Node current = list.head;
    int count = 0;
    while (current.next != current) {
        count++;
        if (count == 5) {
            list.delete(current.next.data);
            count = 0;
        } else {
            current = current.next;
        }
    }
    System.out.println("最后剩下的猴子编号为:" + current.data);
}

2.文件系统循环链表

在文件系统中,文件和目录之间的关系就是树形结构。而在这个结构中,文件夹内的内容列表就可以使用循环链表来实现。

public class FileNode {
    public String name;
    public boolean isFile;
    public FileNode nextFile;

    public FileNode(String name, boolean isFile) {
        this.name = name;
        this.isFile = isFile;
        this.nextFile = null;
    }
}

public class FolderNode {
    public String name;
    public FileNode firstFile;
    public FolderNode nextFolder;

    public FolderNode(String name) {
        this.name = name;
        this.firstFile = null;
        this.nextFolder = null;
    }

    public void addFile(String name, boolean isFile) {
        FileNode file = new FileNode(name, isFile);
        if (firstFile == null) {
            firstFile = file;
            file.nextFile = firstFile;
        } else {
            FileNode current = firstFile;
            while (current.nextFile != firstFile) {
                current = current.nextFile;
            }
            current.nextFile = file;
            file.nextFile = firstFile;
        }
    }

    public void print() {
        System.out.println(name + ": ");
        if (firstFile != null) {
            FileNode current = firstFile;
            do {
                System.out.println("- " + current.name);
                current = current.nextFile;
            } while (current != firstFile);
        }
        if (nextFolder != null) {
            nextFolder.print();
        }
    }
}

public class FileSystem {
    private FolderNode root;

    public FileSystem() {
        this.root = new FolderNode("Root");
    }

    public void addFolder(String path) {
        String[] dirs = path.split("/");
        FolderNode current = root;
        for (String dir : dirs) {
            if (dir.equals("")) {
                continue;
            }
            boolean isFound = false;
            if (current.nextFolder != null) {
                FolderNode temp = current.nextFolder;
                do {
                    if (temp.name.equals(dir)) {
                        current = temp;
                        isFound = true;
                        break;
                    }
                    temp = temp.nextFolder;
                } while (temp != current.nextFolder);
            }
            if (!isFound) {
                FolderNode folder = new FolderNode(dir);
                if (current.nextFolder == null) {
                    current.nextFolder = folder;
                    folder.nextFolder = folder;
                } else {
                    FolderNode temp = current.nextFolder;
                    while (temp.nextFolder != current.nextFolder) {
                        temp = temp.nextFolder;
                    }
                    temp.nextFolder = folder;
                    folder.nextFolder = current.nextFolder;
                }
                current = folder;
            }
        }
    }

    public void print() {
        root.print();
    }
}

在这个文件系统中,可以添加文件夹和文件,同时也支持输出整个文件系统的内容列表。

总结

循环链表是Java数据结构中的一种链表类型,它集合了单向链表和双向链表的优点。通过定义结点类和链表类,我们可以方便地创建和管理循环链表。同时,循环链表也可以被运用到很多实际问题中,例如环形动物队列和文件系统的内容列表。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java数据结构与算法学习之循环链表 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • JavaScript 数据结构之散列表的创建(2)

    下面是详细讲解“JavaScript 数据结构之散列表的创建(2)”的完整攻略。 散列表(哈希表) 散列表是一种数据结构,使用哈希函数将键映射到索引。散列表可以在常量时间 O(1) 中进行插入、删除和查找操作,但也具有碰撞冲突问题。 碰撞冲突问题 在散列表中,当两个不同的键通过哈希函数映射到了同一个索引位置时,就会发生碰撞冲突问题。解决碰撞冲突问题的方法有很…

    数据结构 2023年5月17日
    00
  • C++如何实现BitMap数据结构

    下面我将详细讲解C++如何实现BitMap数据结构的完整攻略,包含以下几个方面: 什么是BitMap数据结构 如何使用C++实现BitMap数据结构 BitMap数据结构的应用示例说明 1. 什么是BitMap数据结构 BitMap数据结构也叫位图,是一种非常简单而高效的数据结构,它主要是用来对大量数字进行存储和操作的。所谓BitMap,就是将一个数字序列通…

    数据结构 2023年5月17日
    00
  • Android开发数据结构算法ArrayList源码详解

    Android开发数据结构算法ArrayList源码详解 概述 Android开发中,大量使用到了数据结构和算法,ArrayList便是其中的一种非常重要的数据结构。ArrayList是Java中非常重要且使用率非常高的一种数据结构,Android开发中也经常使用它来存储数据。本文将深入探究ArrayList的源码,帮助读者更好地理解其工作原理和使用方法。 …

    数据结构 2023年5月17日
    00
  • Java数据结构顺序表用法详解

    Java数据结构顺序表用法详解 什么是顺序表? 在计算机科学中,顺序表(英语:Sequence)指的是一种线性数据结构,通常是用数组实现的。顺序表是一种顺序存放的线性表,其中的每个节点按照顺序依次排列。 顺序表的基本操作 顺序表主要包括以下几个基本操作: 创建顺序表 在顺序表中插入元素 从顺序表中删除元素 获取顺序表中的元素 判断顺序表是否为空 获取顺序表的…

    数据结构 2023年5月17日
    00
  • C语言 数据结构之数组模拟实现顺序表流程详解

    C语言 数据结构之数组模拟实现顺序表流程详解 什么是顺序表? 顺序表是一种基于连续存储结构的数据结构,它可以用一段连续的存储单元来存储线性表中的所有元素。 顺序表的实现思路 顺序表的实现主要依赖数组。我们可以定义一个数组来存储线性表的数据元素,同时再定义一个变量来保存线性表当前的长度。当需要对线性表进行插入、删除、查找等操作时,根据需求,可以通过数组的下标来…

    数据结构 2023年5月17日
    00
  • 在matlab中创建类似字典的数据结构方式

    当需要使用类似字典的数据结构时,Matlab中可以使用结构体来实现。结构体是一种有序的数据集合,每个元素都可以包含不同类型的数据(如字符串、数值等),并通过指定一个名称来唯一地标识该元素。 创建一个空结构体 使用struct函数可以创建一个空的结构体,可以使用下面的代码: st = struct; 添加键值对 可以将键值对添加到结构体中,可以使用下面的代码向…

    数据结构 2023年5月17日
    00
  • C语言中数据结构之链式基数排序

    C语言中数据结构之链式基数排序 概述 链式基数排序是基数排序的一种实现方式。基数排序是一种桶排序算法,它通过将需要排序的数据分成多个桶,并且按照一定的顺序将数据从桶中取出来,以达到排序的目的。链式基数排序则使用了链表结构来实现桶的功能。 实现步骤 链式基数排序的实现步骤如下: 申请链表节点数组,并初始化链表头结点数组。链表的数量等于指定的基数,例如10进制的…

    数据结构 2023年5月17日
    00
  • 实际问题中用到的算法——递归算法确定插帧顺序

    问题: 现在需要给一个视频序列插帧,插帧算法要求每次只能由两帧输入插值得到其中间帧。如果现在需要给一个视频做 4 倍(或者更高的 8,16 倍等类似)的插帧,则一个插帧的思路是当前视频每相邻帧之间插入 3 帧,即:假设插帧前视频帧序号是 0,4,8,12…,则插帧时补充相邻帧跨过的 3 个序号,得到插帧后的视频帧序号为 0,1,2,3,4,5,6,.. 即可…

    算法与数据结构 2023年4月18日
    00
合作推广
合作推广
分享本页
返回顶部