java实现简单单链表

 更新时间:2021年02月25日 10:36:23   作者:xinan~  
这篇文章主要为大家详细介绍了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);
  }
 
}

 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 使用Java实现DNS域名解析的简单示例

    使用Java实现DNS域名解析的简单示例

    这篇文章主要介绍了使用Java实现DNS域名解析的简单示例,包括对一个动态IP主机的域名解析例子,需要的朋友可以参考下
    2015-10-10
  • SpringCloud Alibaba 基本开发框架搭建过程

    SpringCloud Alibaba 基本开发框架搭建过程

    这篇文章主要介绍了SpringCloud Alibaba 基本开发框架搭建过程,开发工具选用的idea,本文通过图文实例相结合给大家分享搭建全过程,需要的朋友可以参考下
    2021-06-06
  • springboot使用CommandLineRunner解决项目启动时初始化资源的操作

    springboot使用CommandLineRunner解决项目启动时初始化资源的操作

    这篇文章主要介绍了springboot使用CommandLineRunner解决项目启动时初始化资源的操作,帮助大家更好的理解和学习使用springboot框架,感兴趣的朋友可以了解下
    2021-02-02
  • Spring Cloud GateWay 路由转发规则介绍详解

    Spring Cloud GateWay 路由转发规则介绍详解

    这篇文章主要介绍了Spring Cloud GateWay 路由转发规则介绍详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-05-05
  • SpringBoot+Mybatis使用Mapper接口注册的几种方式

    SpringBoot+Mybatis使用Mapper接口注册的几种方式

    本篇博文中主要介绍是Mapper接口与对应的xml文件如何关联的几种姿势,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-07-07
  • SpringBoot中关于static和templates的注意事项以及webjars的配置

    SpringBoot中关于static和templates的注意事项以及webjars的配置

    今天小编就为大家分享一篇关于SpringBoot中关于static和templates的注意事项以及webjars的配置,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • Java JUnit 使用及常用注解

    Java JUnit 使用及常用注解

    JUnit是Java开发中必不可少的测试框架之一,它可以帮助您编写高质量、可维护的单元测试,本文介绍了JUnit的基本用法、常用注解、测试套件和参数化测试等内容,希望对您的测试工作有所帮助,感兴趣的朋友一起看看吧
    2023-12-12
  • Spring注解@DependsOn解析

    Spring注解@DependsOn解析

    今天要分享得是Spring的@DependsOn注解,对于@DependsOn,我们从它的名称里面就能看出意思是“依赖于”,那么在Spring中,它的作用就是解决Bean的创建依赖,感兴趣的小伙伴快来阅读吧
    2023-04-04
  • Java Poi 在Excel中输出特殊符号的实现方法

    Java Poi 在Excel中输出特殊符号的实现方法

    这篇文章主要介绍了Java Poi 在Excel中输出特殊符号的实现方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • Java不用算数运算符来实现求和方法

    Java不用算数运算符来实现求和方法

    我们都知道,Java的运算符除了具有优先级之外,还有一个结合性的特点。当一个表达式中出现多种运算符时,执行的先后顺序不仅要遵守运算符优先级别的规定,还要受运算符结合性的约束,以便确定是自左向右进行运算还是自右向左进行运算,但是如果不用运算符怎么求和呢
    2022-04-04

最新评论