• JAVA单向链表实现


    JAVA单向链表实现

    单向链表

    链表和数组一样是一种最常用的线性数据结构,两者各有优缺点。数组我们知道是在内存上的一块连续的空间构成,所以其元素访问可以通过下标进行,随机访问速度很快,但数组也有其缺点,由于数组的内存是一次性申请的,就像基本数据类型一样,一次性申请所需的空间,在数据量变动很大的时候就容易导致预先申请的内存不够或内存浪费。在者就是在存的是有序数列时进行数据插入会比较麻烦,所以链表就是为了弥补数组的不足的一种数据结构。相反的,链表对于变动很大的数据有很大的适应性,而且其对于数据插入和删除很方便。而链表的缺点就是对于内存的浪费,链表除了存储需要的数据还要存储额外的指针。链表的节点示意图如下:

     

    看到指针你可能会想:“我们这不是java语言吗?没有指针啊!”,没错!在我对java了解不是很深的时候我也这么想,但是我要说的是java虽然不允许程序员像c/c++那样使用指针,但java语言本身的实现还是离不开指针的(变量名其实就是指向jvm中一块内存的指针,我就不详述)。请看以下节点的代码:

    //节点数据结构
    private class Node{
    private Object data=null;//数据域
    private Node next=null;//下一个节点
    private Node(Object data) {
    this.data=data;
    }
    }

    这里的节点class我是写成inner class的形式,后面有完整代码。还有一点就是这里object类型,这里也可以使用泛型

    //链表数据结构
    public class SingleLinkList {
    int size=0;//链表长度,可有可无,有的话很容易实现很多链表的特殊操作
    Node head=null;//头节点
    public SingleLinkList() {
    this.size=0;this.head=null;
    }
    }

    有了这两个类,然后再来实现链表的一些基本操作:插入头节点,删除头节点,删除指定节点,查找指定节点。直接看完整源代码。

    package singleLinkList;

    public class SingleLinkList {

    int size=0;//链表长度
    Node head=null;

    public SingleLinkList() {
    this.size=0;this.head=null;
    }

    //节点数据结构
    private class Node{
    private Object data=null;//数据域
    private Node next=null;//下一个节点
    private Node(Object data) {
    this.data=data;
    }
    }

    //表头添加元素
    public Object addHead(Object data) {
    Node newHead=new Node(data);
    if(size==0) {
    this.head=newHead;
    }
    else {
    newHead.next=this.head;
    this.head=newHead;
    }
    size++;
    return data;
    }

    //删除表头元素
    public Object deleteHead() {
    if(size>0) {
    Node node=this.head;
    this.head=this.head.next;
    size--;
    }
    return null;
    }

    //查找指定元素
    public Node findData(Object data) {
    if(size==0)return null;
    Node cur=this.head;
    while(cur!=null) {
    if(cur.data.equals(data))return cur;
    cur=cur.next;
    }
    return null;
    }

    //删除指定元素
    public boolean deleteData(Object data) {
    if(size==0)return false;
    Node pre=head;
    Node cur=head;
    while(cur!=null) {
    if(cur.data.equals(data))break;
    pre=cur;cur=cur.next;
    }
    if(cur!=null) {//找到
    if(cur==head) {//找到在头节点
    deleteHead();
    }
    else {
    pre.next=cur.next;
    size--;
    }
    return true;
    }

    return false;
    }

    //判断是否为空
    public boolean isEmpty() {
    return size==0;
    }

    //查看链表内容
    public void display() {
    if(size==0) {
    System.out.println("[]");
    }
    else {
    System.out.print("[");
    System.out.print(head.data);
    Node cur=head;
    while(cur.next!=null) {
    cur=cur.next;
    System.out.print("->");
    System.out.print(cur.data);
    }
    System.out.println("]");
    }
    }

    }

    调用测试的代码就不给出,只给出一个我测试过程的截图:

     

  • 相关阅读:
    AQS的子类在各个同步工具类中的使用情况
    SpringBoot RabbitMQ 延迟队列代码实现
    Java线程状态、线程start方法源码、多线程、Java线程池、如何停止一个线程
    Java内存模型,为啥线程要有自己的本地内存,CPU高速缓存
    Java内存模型中volatile关键字的作用
    Java内存模型、JVM内存结构和Java对象模型
    搞定springboot项目连接远程服务器上kafka遇到的坑以及完整的例子
    MongoDB导出与导入远程Linux服务器上的数据
    DeferredResult使用方式和场景
    【IT笔试面试题整理】二叉树中和为某一值的路径--从根到叶子节点
  • 原文地址:https://www.cnblogs.com/Davidhwj/p/10433387.html
Copyright © 2020-2023  润新知