LinkedList链表的结构及其内部递归的简单说明

一.链表结构构成以及与ArrayList类的区别

  • 和ArrayList不同的是它是链表结构,而ArrayList是顺序结构。我们平常使用的list是一样的,理论上来说一种list就可以完成我们所有的需求。但是它们在运行过程中有区别的,完成需求所需要的资源也不相同,至于什么情况下使用哪种list就看需求和当前情况了。
  • 链表解决了这个问题。尽管数组在连续的存储位置上存放对象的引用,但链表却将每个对象存放在独立的结点中。每个结点还存放着序列中下一个结点的引用。在Java程序设计语言中,所有链表实际上都是双向链接的—即每个结点还存放着指向前驱结点的引用。

简单的说,采用该结构的集合,对元素的存取有如下的特点:

  • 多个结点之间,通过地址进行连接。例如,多个人手拉手,每个人使用自己的右手拉住下个人的左手,依次 类推,这样多个人就连在一起了。
    在这里插入图片描述

  • 查找元素慢:想查找某个元素,需要通过连接的节点,依次向后查找指定元素

  • 增删元素快:
    -增加元素:只需要修改连接下个元素的地址即可。
    在这里插入图片描述

    -删除元素:只需要修改连接下个元素的地址即可。
    在这里插入图片描述

LinkedList是一个双向链表,那么双向链表是什么样子的呢,我们用个图了解下

在这里插入图片描述
实际开发中对一个集合元素的添加与删除经常涉及到首尾操作,而LinkedList提供了大量首尾操作的方法。这些方 法我们作为了解即可:

  • public void addFirst(E e) :将指定元素插入此列表的开头。

  • public void addLast(E e) :将指定元素添加到此列表的结尾。

  • public E getFirst() :返回此列表的第一个元素。

  • public E getLast() :返回此列表的最后一个元素。

  • public E removeFirst() :移除并返回此列表的第一个元素。

  • public E removeLast() :移除并返回此列表的最后一个元素。

  • public E pop() :从此列表所表示的堆栈处弹出一个元素。

  • public void push(E e) :将元素推入此列表所表示的堆栈。

  • public boolean isEmpty() :如果列表不包含元素,则返回true。

LinkedList是List的子类,List中的方法LinkedList都是可以使用,这里就不做详细介绍,我们只需要了解LinkedList 的特有方法即可。在开发时,LinkedList集合也可以作为堆栈,队列的结构使用。(了解即可)

方法演示:

public static void main(String[] args) {

        Node node = new Node("周瑜" , null);

        node = new Node("曹操" , node);
        node = new Node("刘表" , node);
        node = new Node("刘备" , node);
        node = new Node("张飞" , node);
        node = new Node("关羽" , node);

        String res = getKey("刘备1", node);
        System.out.println(res);
    }

二.递归

2.1 概述

  • 递归:指在当前方法内调用自己的这种现象。

  • 递归的分类:
    1.递归分为两种,直接递归和间接递归。
    2.直接递归称为方法自身调用自己。
    3.间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法。

  • 注意事项:
    1.递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。
    2.在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。
    3.构造方法,禁止递归

简单递归方法如图:

例一:

public static String getKey(String key ,Node node){

        if(node.getData().equals(key)){
            return "找到了";
        }
        if(node.getNode() != null){
            return getKey(key , node.getNode());
        }else{
            return "没有找到";
        }
    }

例二:

public Object get(Object key){
        // 获取 key 余数值
        int tmp = key.hashCode() % DEFAULT_INITIAL_CAPACITY;

        // 递归算法
        Object value = getValue(key, nodes[tmp]);
        return value;
    }

    private Object getValue(Object key ,Node node){
        if(node.key.equals(key)){
            return node.value;
        }
        if( node.node != null){
            return getValue(key , node.node);
        }else{
            return null;
        }

    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值