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日

相关文章

  • C++中的string库函数常见函数的作用和使用方法

    我们就来详细讲解一下C++中的string库函数常见函数的作用和使用方法。 C++中的string库函数常见函数 C++中string库是用来处理字符串的一个库,它提供了很多常用的函数来操作字符串。 1. 字符串长度 获取字符串长度的函数是size()或length(),两者的作用是相同的,都是返回字符串的长度。 示例: #include <iostr…

    other 2023年6月20日
    00
  • Android 模仿QQ侧滑删除ListView功能示例

    Android 模仿QQ侧滑删除ListView功能示例攻略 1. 实现侧滑删除功能的基本思路 要实现类似QQ侧滑删除的功能,我们可以采用以下基本思路: 创建一个自定义的ListView,用于显示列表项。 在每个列表项的布局中,添加一个隐藏的删除按钮布局,该布局可以通过手势滑动来显示。 监听ListView的滑动事件,根据滑动的距离和方向来判断是否显示删除按…

    other 2023年9月7日
    00
  • 华为麦芒8怎么开启开发者选项?

    下面是“华为麦芒8怎么开启开发者选项?”的完整攻略。 第一步:进入设置页面 打开麦芒8手机的主界面,找到并点击“设置”图标,进入手机设置页面。 第二步:查找“系统”选项并点击 在手机设置页面中,向下滑动找到“系统”选项,然后点击进入。 第三步:打开“关于手机”页面 在系统选项中,向下滑动找到“关于手机”选项,然后点击进入。 第四步:快速点击“版本号” 在“关…

    other 2023年6月26日
    00
  • Win10系统DirectX版本升级到12.x 为何有些用户显示DX11.1或更低版本

    Win10系统DirectX版本升级到12.x的攻略 1. 确认系统要求 在升级DirectX版本之前,首先需要确认系统是否满足升级要求。以下是升级到DirectX 12.x的最低系统要求: 操作系统:Windows 10 处理器:支持DirectX 12.x的处理器 显卡:支持DirectX 12.x的显卡 内存:4GB或更高 存储空间:至少需要1GB的可…

    other 2023年8月3日
    00
  • 苹果iOS9.3.3正式版官方固件下载地址汇总

    苹果iOS9.3.3正式版官方固件下载地址汇总攻略 苹果iOS9.3.3正式版官方固件是一款用于iPhone、iPad和iPod Touch设备的操作系统。本攻略将详细介绍如何获取iOS9.3.3正式版官方固件的下载地址。 步骤一:访问苹果官方网站 首先,打开您的浏览器,并访问苹果官方网站(https://www.apple.com)。 步骤二:导航至支持页…

    other 2023年8月4日
    00
  • Android EditText详解及示例代码

    Android EditText详解及示例代码 1. EditText简介 EditText是Android中的一个可编辑TextView,可用于用户输入文本。而TextView是Android中的一个用于显示文本的控件,不可以进行输入操作。EditText相比TextView多了一些属性和事件,可以添加输入限制、输入提示等等,这些特性使得EditText更…

    other 2023年6月26日
    00
  • 关于UDP服务器客户端编程流程介绍

    关于UDP服务器客户端编程流程介绍 1. UDP服务器编程流程 步骤1:创建UDP socket 在使用UDP进行通信前,需要选定一个端口号并创建一个UDP socket。可以使用以下代码创建一个UDP socket: import socket # 创建一个UDP socket server_socket = socket.socket(socket.AF…

    other 2023年6月27日
    00
  • spring-boot-starter-validation 校验参数的实现

    Spring Boot Starter Validation 校验参数的实现攻略 Spring Boot Starter Validation 是一个用于校验参数的 Spring Boot Starter,它基于 Hibernate Validator 实现了参数校验的功能。在本攻略中,我们将详细讲解如何使用 Spring Boot Starter Vali…

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