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日

相关文章

  • 算法总结–ST表

    声明(叠甲):鄙人水平有限,本文为作者的学习总结,仅供参考。 1. RMQ 介绍 在开始介绍 ST 表前,我们先了解以下它以用的场景 RMQ问题 。RMQ (Range Minimum/Maximum Query)问题是指:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j里的最小(大)值,也就是说,RMQ…

    算法与数据结构 2023年4月18日
    00
  • JavaScript数据结构Number

    JavaScript数据结构Number 简介 JavaScript中的Number是一种表示数字的数据类型,包括整数和浮点数。Number类型的值是不可变的。 数字类型(Number)的创建 数字类型可以通过直接赋值的方式创建,如: let num = 10; // 整数 let floatNum = 3.14; // 浮点数 另外,JavaScript还…

    数据结构 2023年5月17日
    00
  • C语言数据结构之单链表存储详解

    C语言数据结构之单链表存储详解 什么是单链表 链表是一种非顺序存储的数据结构,其每个节点都保存下一个节点的地址。单链表是最简单的链表,每个节点只包含下一个节点的地址。 单链表节点的定义 单链表的节点定义一般包括两个部分:数据域和指针域。数据域存放节点的数据,指针域存放下一个节点的地址。 以下是单链表节点的定义: typedef struct node { i…

    数据结构 2023年5月17日
    00
  • C语言如何建立链表并实现增删查改详解

    这是一个比较复杂的问题,需要严谨的思考和详细的解释。下面我将按照以下三个部分,分别介绍: 什么是链表,链表的基本结构和实现方法 如何在C语言中建立链表并实现增删查改 两个示例说明 1. 链表的基本结构和实现方法 链表是一种线性数据结构,每个节点包含两个域:一个数据域和一个指针域。数据域存储节点的数据,指针域存储下一个节点的地址。每个节点都可以独立分配空间,所…

    数据结构 2023年5月17日
    00
  • Java数据结构之线段树的原理与实现

    Java数据结构之线段树的原理与实现 什么是线段树 线段树是一种基于分治思想的数据结构,它可以用来解决各种区间查询问题,例如区间求和、最大值、最小值等等。在算法竞赛和数据结构课程中,线段树被广泛应用,是一种非常实用的数据结构。 线段树的基本原理 线段树是一种二叉树,它的每个节点包含一个区间,叶子节点表示区间中的单个元素,非叶子节点表示区间的合并。 线段树的建…

    数据结构 2023年5月17日
    00
  • mosn基于延迟负载均衡算法 — 走得更快,期待走得更稳

    前言 这篇文章主要是介绍mosn在v1.5.0中新引入的基于延迟的负载均衡算法。 对分布式系统中延迟出现的原因进行剖析 介绍mosn都通过哪些方法来降低延迟 构建来与生产环境性能分布相近的测试用例来对算法进行验证 地址:https://github.com/mosn/mosn/pull/2253 在开始聊基于延迟的负载均衡算法之前,先介绍下什么是负载均衡——…

    算法与数据结构 2023年5月8日
    00
  • Lua中使用table实现的其它5种数据结构

    Lua中使用table可以实现多种数据结构,除了Lua原生支持的数组、哈希表之外,我们还可以用table来实现其他五种数据结构,这些数据结构包括集合(Set)、队列(Queue)、双端队列(deque)、堆栈(stack)以及链表(List)。 Set 集合数据结构中的元素是无序的、不重复的。使用table来实现集合数据结构,可以将元素作为table的key…

    数据结构 2023年5月17日
    00
  • 浅谈iOS 数据结构之链表

    浅谈iOS 数据结构之链表 在计算机科学中,链表是一种数据结构,用于存储一系列按顺序排列的元素。链表的一个关键点是它不需要连续的内存空间来存储元素,相反,每个元素由一个指向下一个元素的指针组成。在iOS开发中,链表在各种场景下都有所应用,如UITableView和UICollectionView的数据源等。本文将详细讲解链表的基本知识和使用技巧。 链表的基本…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部