Java链表(Linked List)基本原理与实现方法入门示例

yizhihongxing

下面是Java链表(Linked List)基本原理与实现方法入门示例的完整攻略。

什么是链表

链表是一种线性的数据结构,由一系列节点组成。每个节点都包含了数据和指向下一个节点的指针。

相比于数组,链表的一个主要优点是在插入、删除元素时不需要移动其他元素,因为每个节点都有指向下一个节点的指针。但是,链表的缺点是不能像数组一样随机访问,只能从头部开始遍历。

实现方法

Java实现单向链表

Java实现单向链表需要定义一个Node类,用于表示链表中的节点。定义一个链表类LinkedList,拥有添加节点方法(addNode)、删除节点方法(deleteNode)、遍历节点方法(traverseNodes)、清空链表方法等方法。

例如,以下为Java实现单向链表的示例代码:

public class Node {
    int data;
    Node next;

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

public class LinkedList {
    Node head;

    public void addNode(int data) {
        Node newNode = new Node(data);
        if (head == null) {
            head = newNode;
        } else {
            Node current = head;
            while (current.next != null) {
                current = current.next;
            }
            current.next = newNode;
        }
    }

    public void deleteNode(int data) {
        Node current = head;
        Node previous = null;
        while (current != null && current.data != data) {
            previous = current;
            current = current.next;
        }
        if (current != null) {
            if (previous == null) {
                head = current.next;
            } else {
                previous.next = current.next;
            }
        }
    }

    public void traverseNodes() {
        Node current = head;
        while (current != null) {
            System.out.println(current.data);
            current = current.next;
        }
    }

    public void clearList() {
        head = null;
    }
}

Java实现双向链表

Java实现双向链表需要在Node类中再添加前驱节点(previous)的指针,链表类中添加反向遍历节点方法(reverseTraverseNodes),其他方法和单向链表的实现类似。

例如,以下为Java实现双向链表的示例代码:

public class Node {
    int data;
    Node next;
    Node previous;

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

public class DoublyLinkedList {
    Node head;

    public void addNode(int data) {
        Node newNode = new Node(data);
        if (head == null) {
            head = newNode;
        } else {
            Node current = head;
            while (current.next != null) {
                current = current.next;
            }
            current.next = newNode;
            newNode.previous = current;
        }
    }

    public void deleteNode(int data) {
        Node current = head;
        while (current != null && current.data != data) {
            current = current.next;
        }
        if (current != null) {
            if (current.previous == null) {
                head = current.next;
                if (head != null) {
                    head.previous = null;
                }
            } else {
                current.previous.next = current.next;
                if (current.next != null) {
                    current.next.previous = current.previous;
                }
            }
        }
    }

    public void traverseNodes() {
        Node current = head;
        while (current != null) {
            System.out.println(current.data);
            current = current.next;
        }
    }

    public void reverseTraverseNodes() {
        Node current = head;
        while (current.next != null) {
            current = current.next;
        }
        while (current != null) {
            System.out.println(current.data);
            current = current.previous;
        }
    }

    public void clearList() {
        head = null;
    }
}

示例说明

以下为使用单向链表实现LIFO(后进先出)栈的示例代码:

public class Stack {
    LinkedList list;

    public Stack() {
        list = new LinkedList();
    }

    public void push(int data) {
        list.addNode(data);
    }

    public int pop() {
        Node current = list.head;
        if (current == null) {
            throw new NoSuchElementException();
        } else if (current.next == null) {
            list.head = null;
            return current.data;
        } else {
            while (current.next.next != null) {
                current = current.next;
            }
            int data = current.next.data;
            current.next = null;
            return data;
        }
    }

    public void printStack() {
        list.traverseNodes();
    }
}

使用方式:

Stack stack = new Stack();
stack.push(1);
stack.push(2);
stack.push(3);  // 栈中元素为 3 -> 2 -> 1
stack.pop();    // 弹出元素3,栈中元素为 2 -> 1
stack.push(4);  // 栈中元素为 4 -> 2 -> 1
stack.printStack();  // 输出 4 2 1

以下为使用双向链表实现LIFO(后进先出)队列的示例代码:

public class Queue {
    DoublyLinkedList list;

    public Queue() {
        list = new DoublyLinkedList();
    }

    public void enqueue(int data) {
        list.addNode(data);
    }

    public int dequeue() {
        Node current = list.head;
        if (current == null) {
            throw new NoSuchElementException();
        } else if (current.next == null) {
            list.head = null;
            return current.data;
        } else {
            list.head = current.next;
            current.next.previous = null;
            return current.data;
        }
    }

    public void printQueue() {
        list.traverseNodes();
    }
}

使用方式:

Queue queue = new Queue();
queue.enqueue(1);
queue.enqueue(2);
queue.enqueue(3);  // 队列中元素为 1 <- 2 <- 3
queue.dequeue();   // 弹出元素1,队列中元素为 2 <- 3
queue.enqueue(4);  // 队列中元素为 2 <- 3 <- 4
queue.printQueue();  // 输出 2 3 4

以上两个示例代码对于链表的基本操作进行了展示,并且演示了如何通过链表实现栈和队列。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java链表(Linked List)基本原理与实现方法入门示例 - Python技术站

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

相关文章

  • JSP简明教程:令人兴奋的脚本编程

    JSP简明教程:令人兴奋的脚本编程 什么是JSP JSP(JavaServer Pages)是一种用于创建动态Web页面的技术,它允许在HTML页面中编写Java代码,以实现动态处理和内容生成。在JSP页面中,可以使用Java代码、HTML标签和JSP标签,以及表达式语言(EL)来动态生成页面内容。 JSP的工作原理 JSP页面在服务器端动态生成,当用户请求…

    Java 2023年6月15日
    00
  • MyBatis动态SQL表达式详解

    MyBatis动态SQL是针对不同情况下需要根据不同条件动态调整SQL语句的需求而产生的一种功能,具有很强的灵活性和可读性。其中动态SQL表达式是实现动态SQL的关键,本文将解析MyBatis中动态SQL表达式的使用方法和一些示例。 什么是MyBatis动态SQL表达式 MyBatis动态SQL表达式一般用于编写可动态调整SQL的Mapper文件,可以根据不…

    Java 2023年5月19日
    00
  • 2021最新Java JDK1.8的安装超详细教程

    2021最新Java JDK1.8的安装超详细教程 简介 Java JDK是开发和运行Java程序的必备工具。本文将详细介绍如何安装最新版的Java JDK1.8,并包含一些实例,帮助您更好的理解和使用Java JDK。 步骤 步骤1:下载安装包 首先,您需要下载Java JDK1.8的安装包。您可以通过以下链接下载: Java JDK1.8官方下载页面 请…

    Java 2023年5月19日
    00
  • java中字符串常见的方法及总结

    Java中字符串常见的方法及总结 在Java中,字符串(String)是一个非常常见的数据类型。在日常开发中,字符串的操作是必不可少的。下面我们来总结一下Java中字符串常用的方法。 字符串的创建 在Java中,有几种不同的方式来创建字符串。 直接赋值创建字符串 我们可以直接使用双引号来创建字符串,如下所示: String str1 = "Hell…

    Java 2023年5月26日
    00
  • mybatis 模糊查询的实现方法

    MyBatis是一种流行的Java ORM框架,它可以帮助开发人员轻松地访问数据库。模糊查询是一种常见的查询方式,用于在所有符合特定标准的结果中查找符合特定模式的结果。在MyBatis中实现模糊查询非常简单,本文将详细介绍如何实现。 1. LIKE关键字 实现模糊查询的最常见方法是使用SQL的LIKE关键字。这个关键字指示数据库在检索数据时应该搜索包含指定模…

    Java 2023年5月20日
    00
  • Gateway+Swagger2配置聚合文档方式

    下面是“Gateway+Swagger2配置聚合文档方式”的完整攻略,包含以下几个步骤: 1. 引入Swagger2依赖 在网关服务的pom.xml文件中添加Swagger2依赖: <dependency> <groupId>io.springfox</groupId> <artifactId>springfo…

    Java 2023年6月3日
    00
  • MyBatis动态SQL特性详解

    MyBatis动态SQL特性详解 什么是动态SQL 动态SQL是指在运行时根据不同的条件来动态生成SQL语句的技术,MyBatis支持动态SQL。 使用动态SQL可以在不同的查询条件下进行灵活的SQL组合,提高SQL语句的复用性和灵活性。 动态SQL实现方式 MyBatis提供了两种方式来实现动态SQL:使用XML实现和使用注解实现。 使用XML实现 if元…

    Java 2023年5月19日
    00
  • 利用Springboot+vue实现图片上传至数据库并显示的全过程

    下面是利用Spring Boot和Vue实现图片上传至数据库并显示的全过程。 前置准备 技术栈 Spring Boot Vue.js axios ElementUI MySQL MyBatis 下载代码 可以从GitHub上下载示例代码:https://github.com/KevinPang2019/springboot-vue-image-upload …

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