JAVA 数据结构链表操作循环链表

JAVA 数据结构链表操作循环链表

什么是链表

链表(Linked List)是一种常见的基础数据结构,它可以存储一个线性序列,但与数组不同的是,链表中的元素并不是在内存中连续存储的,而是通过指针将它们链接在一起。

链表由一系列节点组成,每个节点包含两部分:数据和指向下一节点的指针。最后一个节点的指针指向 NULL 表示链表的结尾。

链表常见的操作有:插入、删除、查找、遍历等。其中,插入和删除操作是链表的特点之一,因为链表中的元素并不是在内存中连续存储的,对于插入和删除操作并没有数组那样的位移操作,这也使得链表的插入和删除操作效率比数组高。而查找和遍历操作则需要使用指针进行相应的操作。

常见的链表类型

在链表的实现中,有两种常见的类型:单向链表和双向链表。它们的区别在于节点的指针个数不同,单向链表只有指向下一节点的指针,而双向链表有指向下一节点和前一节点的指针。

此外,在循环链表中,最后一个节点的指针不为 NULL,而是指向链表的头节点,这样链表的开头和结尾就可以随意切换,可以实现循环递归操作。

JAVA 中的链表实现

JAVA 中的链表可以通过自己的类来实现,也可以使用 JAVA 中提供的集合类来实现。对于后者,常见的链表类有 LinkedList 和 ArrayDeque。

LinkedList 类实现了 List 接口,它包含了双向链表的实现,同时还实现了 Queue 接口,可以当作队列来使用。

ArrayDeque 类同样实现了 Queue 接口,它使用数据结构双端队列来实现,操作效率比 LinkedList 更高。

以下为在 Java 中使用链表模拟循环队列的示例代码:

import java.util.LinkedList;
import java.util.Queue;

public class CircularQueue {
    private int size;

    private Queue<Integer> queue;

    public CircularQueue(int size) {
        this.size = size;
        this.queue = new LinkedList<>();
    }

    public boolean enQueue(int value) {
        if (queue.size() == size) {
            return false;
        }
        queue.add(value);
        return true;
    }

    public boolean deQueue() {
        if (queue.isEmpty()) {
            return false;
        }
        queue.remove();
        return true;
    }

    public int Front() {
        if (queue.isEmpty()) {
            return -1;
        }
        return queue.peek();
    }

    public int Rear() {
        if (queue.isEmpty()) {
            return -1;
        }
        return ((LinkedList<Integer>) queue).getLast();
    }

    public boolean isEmpty() {
        return queue.isEmpty();
    }

    public boolean isFull() {
        return queue.size() == size;
    }
}

链表操作循环链表的示例

示例1:Java 实现循环链表

public class Node {
    int val;

    Node next;

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

public class CircleLinkList {

    private Node head;

    public CircleLinkList(int num) {
        this.head = null;
        if (num > 0) {
            Node pre = null;
            for (int i = 1; i <= num; i++) {
                Node cur = new Node(i);
                if (head == null) {
                    head = cur;
                } else {
                    pre.next = cur;
                }
                pre = cur;
            }
            pre.next = head;
        }
    }

    public int size() {
        int size = 0;
        Node cur = head;
        while (cur != null && (cur.next != head || size == 0)) {
            size++;
            cur = cur.next;
        }
        return size;
    }

    public int get(int index) {
        Node cur = head;
        int count = 0;
        while (cur != null && (cur.next != head || count == 0)) {
            if (count == index) {
                return cur.val;
            }
            count++;
            cur = cur.next;
        }
        return -1;
    }

    public void visualize() {
        Node cur = head;
        while (cur != null && cur.next != head) {
            System.out.print(cur.val + "->");
            cur = cur.next;
        }
        if (cur != null) {
            System.out.print(cur.val);
        }
        System.out.println();
    }
}

以上代码实现了一个循环链表,通过构造方法创建了一个 num 个节点的循环链表。size() 方法用于获取循环链表的长度,get(int index) 方法用于获取循环链表中对应索引位置的元素,visualize() 方法用于将循环链表进行输出。

示例2:Java 实现链表加法

public class ListNode {
    int val;
    ListNode next;

    public ListNode(int x) {
        val = x;
    }
}

public class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode head = null, tail = null;
        int carry = 0;
        while (l1 != null || l2 != null) {
            int n1 = l1 != null ? l1.val : 0;
            int n2 = l2 != null ? l2.val : 0;
            int sum = n1 + n2 + carry;
            if (head == null) {
                head = tail = new ListNode(sum % 10);
            } else {
                tail.next = new ListNode(sum % 10);
                tail = tail.next;
            }
            carry = sum / 10;
            if (l1 != null) {
                l1 = l1.next;
            }
            if (l2 != null) {
                l2 = l2.next;
            }
        }
        if (carry > 0) {
            tail.next = new ListNode(carry);
        }
        return head;
    }
}

以上代码实现了两个链表的加法操作,将两个链表中的元素进行加法运算,得到结果链表。其中,l1 和 l2 为两个链表的头节点,head 和 tail 分别表示结果链表的头节点和尾节点,carry 表示进位,while 循环用于遍历链表进行加法运算。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JAVA 数据结构链表操作循环链表 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • httpwatch工具简介及使用技巧

    HttpWatch工具简介及使用技巧攻略 什么是HttpWatch HttpWatch是一个集成于浏览器的http网络流量监控及调试工具,它支持IE和Edge、Chrome和Firefox浏览器。 HttpWatch的功能 HttpWatch可以捕获浏览器在发送http请求过程中的一些重要信息,如请求主机、headers、cookies、请求方法、请求时间等…

    其他 2023年4月16日
    00
  • maven学习-初窥门径

    Maven学习-初窥门径 什么是Maven? Maven是一个强大的项目管理工具,用于构建、发布和管理Java项目。它提供了一种标准化的项目结构、依赖管理和构建过程,使得项目的开发和维护更加简单和高效。 Maven的安装和配置 下载Maven:从Maven官网(https://maven.apache.org)下载最新版本的Maven压缩包。 解压Maven…

    other 2023年10月13日
    00
  • 编写codemirrormodes详解

    CodeMirror是一个用于在浏览器中编辑代码的JavaScript库。它支持多种编程语言和主题,并且可以通过编写自定义模式来支持更多的语言。下面是编写CodeMirror模式的详细攻略: 了解CodeMirror模式的结构 CodeMirror模式由以下几个部分组成: token:代表代码中的一个单词或符号。 state:代表代码的当前状态,例如在函数内…

    other 2023年5月7日
    00
  • 基于arduino的wifi无线传输

    以下是关于“基于Arduino的WiFi无线传输”的完整攻略,包含两个示例说明。 基于Arduino的WiFi无线传输 在Arduino中,我们使用WiFi模块来实现无线传输。以下是一个基本的步骤: 连接WiFi模块到Arduino板上 在Arduino IDE中安装WiFi库。 编写代码来连接WiFi网络。 编写代码来发送和接收数据。 示例1:连接WiFi…

    other 2023年5月9日
    00
  • iOS中实现检测Zoombie对象的具体方法

    iOS中实现检测Zombie对象的具体方法 什么是Zombie对象? 在iOS开发中,Zombie对象是指已经被释放(dealloc)但仍然被访问的对象。这种情况可能会导致应用崩溃或产生难以调试的Bug。为了解决这个问题,我们可以使用Xcode提供的一些工具和技术来检测和调试Zombie对象。 使用Instruments检测Zombie对象 Instrume…

    other 2023年6月28日
    00
  • ActiveX部件不能创建对象:dm.dmsoft代码:800A01AD

    ActiveX部件不能创建对象:dm.dmsoft代码:800A01AD 解决方法 当在运行时遇到错误\”ActiveX部件不能创建对象:dm.dmsoft代码:800A01AD\”时,可能是由于以下原因导致的: 缺少所需的ActiveX组件:确保所需的ActiveX组件已正确安装在系统中。可以尝试重新安装或更新相关的组件。 缺少注册表项:检查注册表中是否存…

    other 2023年10月14日
    00
  • cygwin使用心得

    使用心得:Cygwin 简介 Cygwin 是一个免费的工具,可以在 Windows 系统上执行类似于 Unix/Linux 系统下的命令。使用 Cygwin 可以让 Windows 用户体验到许多 Unix/Linux 下常用的命令工具和一些 Shell 脚本。使用 Cygwin 可以方便 Windows 用户应用一些 Linux 上独有的工具和环境。下面…

    other 2023年6月27日
    00
  • iOS实现实时检测网络状态的示例代码

    下面就为大家详细讲解如何实现iOS实时检测网络状态的示例代码。 一、概述 在移动应用开发中,检测网络状态时非常必要的一项功能。iOS提供了一个Reachability类用于判断当前网络状态,本文将介绍如何使用Reachability类实现实时检测网络状态的功能,并提供两个使用示例。 二、实现步骤 1.导入Reachability框架 在项目中导入Reacha…

    other 2023年6月26日
    00
合作推广
合作推广
分享本页
返回顶部