java 静态链表实现示例详解

 更新时间:2023年06月02日 14:18:33   作者:雨翔河  
这篇文章主要为大家介绍了java 静态链表实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

正文

试着用 java 来实现下链表,因为 java 没有指针概念的缘故,用数组的下标来代替指针,这样一个静态链表就出来了。

静态双向不循环链表

public class Test {
    public static void main(String[] args) {
        L l = new L();
        l.init();
        l.insert(123);
        l.insert(456);
        l.insert(789);
        l.insert(222);
        int removeIndex = l.insert(333);
        l.show();
        l.removeNode(removeIndex);
        l.show();
        System.exit(0);
    }
}
/**
 * 静态链表
 */
class L {
    private static final int MAX = 100;  //链表的最大容量
    private Node node[] = new Node[MAX];
    private int head;  //头指针,头指针区域可存储数据也可以不存储数据,只用来做向导,我这里是存储了数据.
    class Node {
        public int next = -1;  //指针指向的后一个节点
        public int pre = -1;  //指针指向的前一个节点
        public long value = -1;  //节点的值
    }
    /**
     * 初始化链表空间,其实这个可以在实例化类的时候完成的.
     */
    public void init() {
        head = 0;
        for (int i = 0; i < MAX; i++) {
            node[i] = new Node();
            node[i].next = -1;  //为了简单的实现下,假设空值为-1
            node[i].pre = -1;
            node[i].value = -1;
        }
    }
    /**
     * 分配节点空间,类似于c里的malloc
     *
     * @return int
     */
    public int malloc() {
        for (int i = 0; i < MAX; i++) {
            if (node[i].pre < 0 && node[i].next < 0 && node[i].value < 0) {
                return i;
            }
        }
        System.out.println("malloc fail ,full");
        return -1;
    }
    /**
     * 移除节点
     *
     * @param indexNode indexNode
     */
    public void removeNode(int indexNode) {
        if (indexNode < 0) {
            System.out.println("removeNode indexNode is error");
            return;
        }
        int preNode = node[indexNode].pre;
        int nextNode = node[indexNode].next;
        node[indexNode].pre = -1;
        node[indexNode].next = -1;
        node[indexNode].value = -1;
        if (nextNode >= 0) {
            node[nextNode].pre = preNode;
        }
        //头节点被移除
        if (preNode < 0) {
            head = nextNode;
        } else {
            node[preNode].next = nextNode;
        }
    }
    /**
     * 插入节点
     *
     * @param v v
     */
    public int insert(long v) {
        int index = head;
        while (node[index].next >= 0) {
            index = node[index].next;
        }
        int insertNodeIndex = malloc();
        if (insertNodeIndex < 0) {
            System.out.println("malloc error,please check malloc function.");
            return -1;
        }
        node[insertNodeIndex].value = v;
        if (insertNodeIndex == head) {
            node[insertNodeIndex].pre = -1;
        } else {
            node[index].next = insertNodeIndex;
            node[insertNodeIndex].pre = index;
        }
        return insertNodeIndex;
    }
    /**
     * 测试下显示这个链表
     */
    public void show() {
        int index = head;
        System.out.println("show l:-------------------------");
        while (node[index].next >= 0) {
            System.out.println(node[index].value);
            index = node[index].next;
        }
        System.out.println(node[index].value);
        System.out.println("show l end:-----------------------");
        System.out.println("test show l start:_______________");
        while (node[index].pre >= 0) {
            System.out.println(node[index].value);
            index = node[index].pre;
        }
        System.out.println(node[index].value);
        System.out.println("test show l end:_______________");
    }
}

以上就是java 静态链表实现示例详解的详细内容,更多关于java 静态链表的资料请关注脚本之家其它相关文章!

相关文章

  • spring关于组件的注入及获取流程场景分析

    spring关于组件的注入及获取流程场景分析

    这篇文章主要介绍了spring关于组件的注入及获取流程场景分析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-07-07
  • Java跨session实现token接口测试过程图解

    Java跨session实现token接口测试过程图解

    这篇文章主要介绍了Java跨session实现token接口测试过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • 实例讲解Java中的synchronized

    实例讲解Java中的synchronized

    这篇文章主要介绍了Java中synchronized的使用方法,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • java9的JShell小工具和编译器两种自动优化方法

    java9的JShell小工具和编译器两种自动优化方法

    这篇文章主要介绍了java9的JShell小工具和编译器两种自动优化方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • Java lambda表达式与泛型整理总结

    Java lambda表达式与泛型整理总结

    Lambda 表达式(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名。泛型编程,故如其名,是一个泛化的编程方式。其实现原理为程序员编写一个函数/类的代码示例,让编译器去填补出不同的函数实现
    2022-07-07
  • Java多线程通信wait()和notify()代码实例

    Java多线程通信wait()和notify()代码实例

    这篇文章主要介绍了Java多线程通信wait()和notify()代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • java如何在项目中实现excel导入导出功能

    java如何在项目中实现excel导入导出功能

    这篇文章主要介绍了java如何在项目中实现excel导入导出功能的相关资料,EasyExcel是一个基于Apache POI开发的开源Java库,用于简化Excel文件的读写操作,文中将用法介绍的非常详细,需要的朋友可以参考下
    2024-10-10
  • springboot使用之多个filter的执行顺序以及配置方式

    springboot使用之多个filter的执行顺序以及配置方式

    这篇文章主要介绍了springboot使用之多个filter的执行顺序以及配置方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • Java集合系列之ArrayList源码分析

    Java集合系列之ArrayList源码分析

    这篇文章主要为大家详细介绍了Java集合系列之ArrayList源码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • Spring AOP之@Around,@AfterReturning使用、切不进去的解决方案

    Spring AOP之@Around,@AfterReturning使用、切不进去的解决方案

    这篇文章主要介绍了Spring AOP之@Around,@AfterReturning使用、切不进去的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05

最新评论