java实现简单单链表

作者:xinan~ 时间:2023-10-30 09:45:46 

本文实例为大家分享了java实现简单单链表的具体代码,供大家参考,具体内容如下

一、定义:

单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(相当于JAVA中的引用,指示后继元素存储位置,),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。

二、结构:

java实现简单单链表

如图所示,data就是当前节点的数据,next是指针,指针存放的是内存地址,是当前结点的下一结点内存地址,顺着这个地址就能找到下一个结点。

三、代码实现:


package com.example.demo.linkedlist;

/**
* 结点
* Created by xinan on 2021/02/23
*/
public class Node {

public Integer value;

public Node next;

public Node(Integer value) {
   this.value = value;
 }

public Node(Integer value, Node next) {
   this.value = value;
   this.next = next;
 }

public Integer getValue() {
   return value;
 }

public void setValue(Integer value) {
   this.value = value;
 }

public Node getNext() {
   return next;
 }

public void setNext(Node next) {
   this.next = next;
 }

}

package com.example.demo.linkedlist;

/**
* 单链表
* Created by xinan on 2021/2/23
*/
public class SingleLinkedList {

public Node head;

/**
  * 从头部添加
  * @param data 待添加数据
  */
 public void addHead(Integer data) {
   Node node = new Node(data);
   node.next = head;
   head = node;
 }

/**
  * 从尾部添加
  * @param data 待添加数据
  */
 public void addLast(Integer data) {
   Node node = new Node(data);
   if (head == null) {
     head = node;
     return;
   }
   Node temp = head;
   while (temp.next != null) {
     temp = temp.next;
   }
   temp.next = node;
 }

/**
  * 获取链表的长度
  * @return 链表长度
  */
 public Integer length() {
   int length = 0;
   Node temp = head;
   while (temp != null) {
     temp = temp.next;
     length ++;
   }
   return length;
 }

/**
  * 从指定下标处添加
  * @param index 指定下标
  * @param data 待添加的数据
  */
 public void addByIndex(int index, Integer data) {
   if (index < 0 || index > length()) {
     System.out.println("插入下标不合规,请检查!");
     return;
   }
   if (index == 0) {
     addHead(data);
     return;
   }
   Node node = new Node(data);
   Node temp = head;
   for (int i = 1; i < index; i++) {
     temp = temp.next;
   }
   node.next = temp.next;
   temp.next = node;
 }

/**
  * 指定下标删除
  * @param index 指定下标
  */
 public void deleteByIndex(int index) {
   if (index < 0 || index > length()) {
     System.out.println("删除下标不合规,请检查!");
     return;
   }
   if (index == 0) {
     head = head.next;
     return;
   }
   Node temp = head;
   for (int i = 1; i < index; i++) {
     temp = temp.next;
   }
   temp.next = temp.next.next;
 }

/**
  * 通过下标获取结点
  * @param index 下标
  * @return 结点
  */
 public Node getByIndex(Integer index) {
   if (index < 0 || index > length() - 1) {
     System.out.println("不存在此下标结点");
   }
   Node temp = head;
   int i = 0;
   while (temp != null) {
     if (i == index) {
       return temp;
     }
     i ++;
     temp = temp.next;
   }
   return null;
 }

/**
  * 打印链表值
  */
 public void printLink() {
   Node temp = head;
   while (temp != null) {
     System.out.println(temp.value);
     temp = temp.next;
   }
 }

/**
  * 打印某个节点之后的所有值
  * @param node
  */
 public static void printAfterNode(Node node) {
   while (node != null) {
     System.out.println(node.value);
     node = node.next;
   }
 }

/**
  * 清除单链表
  */
 public void clearLink() {
   head = null;
 }

/**
  * 单链表反转
  * @param head 头节点
  */
 public Node reverseLink(Node head) {
   Node prev = null;
   Node curr = head;
   while (curr != null) {
     Node nextTemp = curr.next;
     curr.next = prev;
     prev = curr;
     curr = nextTemp;
   }
   return prev;
 }

/**
  * 测试
  * @param args
  */
 public static void main(String[] args) {
   SingleLinkedList linkNode = new SingleLinkedList();
   linkNode.addHead(2);
   linkNode.addHead(3);
   linkNode.addHead(5);
   linkNode.addLast(9);
   linkNode.addLast(7);
   System.out.println("打印单链表: ");
   linkNode.printLink();
   Node byIndex1 = linkNode.getByIndex(0);
   System.out.println("获取下标为1的结点值: " + byIndex1.value);
   linkNode.addByIndex(2, 8);
   System.out.println("下标2添加后打印单链表: ");
   linkNode.printLink();
   linkNode.addByIndex(0, 11);
   System.out.println("下标0添加后打印单链表: ");
   linkNode.printLink();
   linkNode.deleteByIndex(0);
   System.out.println("下标0删除后打印单链表: ");
   linkNode.printLink();
   Node node = linkNode.reverseLink(linkNode.head);
   System.out.println("反转后打印单链表: ");
   printAfterNode(node);
 }

}

来源:https://blog.csdn.net/pavel101/article/details/114004379

标签:java,单链表
0
投稿

猜你喜欢

  • Java毕业设计实战项目之宠物商城系统的实现流程

    2022-03-02 06:10:41
  • Java微信公众平台开发(11) 微信三大平台的关联

    2022-10-15 06:55:56
  • 深入JAVA对象深度克隆的详解

    2022-01-05 14:03:13
  • Java nacos动态配置实现流程详解

    2021-06-04 19:18:30
  • 解析Java的Hibernate框架中的持久化类和映射文件

    2023-08-19 15:00:05
  • Android微信右滑退出功能的实现代码

    2021-12-26 07:15:48
  • Linux环境g++编译GDAL动态库操作方法

    2022-02-23 09:41:45
  • Java多线程编程之ThreadLocal线程范围内的共享变量

    2022-03-10 00:41:05
  • VC对自定义资源加密解密(AES)的详解

    2023-01-10 00:27:15
  • 详解Java中字符流与字节流的区别

    2023-01-14 00:19:58
  • 详解Flutter和Dart取消Future的三种方法

    2022-10-15 12:44:16
  • Android编程实现播放视频的方法示例

    2023-04-20 06:34:17
  • Android实现遮罩层(蒙板)效果

    2023-04-26 18:43:03
  • 浅谈Java后台对JSON格式的处理操作

    2023-02-16 07:28:36
  • Android自定义水波纹底部导航的实现

    2022-08-23 13:12:35
  • Spring Security保护用户密码常用方法详解

    2023-01-24 17:06:18
  • Android开发中解析xml文件XmlUtils工具类与用法示例

    2023-03-26 01:05:45
  • Java 常见的限流算法详细分析并实现

    2022-01-05 22:11:09
  • C#计算器编写代码

    2022-12-28 02:57:25
  • ShardingSphere jdbc实现分库分表核心概念详解

    2023-11-24 12:09:45
  • asp之家 软件编程 m.aspxhome.com