百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

Java链表是什么

toyiye 2024-05-25 20:11 17 浏览 0 评论

阿粉相信大家对链表都非常的熟悉,而阿粉最近面试的时候,就遇到了一个一个面试官,在面试的过程中,面试官给阿粉出了一个比较好玩的问题,让阿粉提供多种实现方式来进行实现,得亏阿粉之前看了(背了)好多的面试题,于是阿粉就开始了自己的表演。

什么是链表

百度百科说:

链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。

一般的链表都是用来和数组进行区分的,与数组不同的是,它是用一组任意的存储单元来存储线性表中的数据,存储单元不一定是连续的,而且链表的长度不是固定的。

而数组则是顺序存储结构,链表通过指针连接元素,而数组则是把所有元素按顺序进行存储,链表插入和删除元素不需要移动元素,数组删除和增加元素需要移动元素。

这也是链表和数组之间的区别。

说完了什么是链表之后,阿粉就来说说这个面试题吧。

面试题:从尾到头打印链表

在这里插入图片描述

输入链表的第一个节点,从尾到头反过来打印出每个结点的值!

那么这个题目都有哪些的实现思路呢?

当面试官给出这个题目的时候,很多人的第一印象,什么鬼,你想让我怎么实现?

给我一个链表,然后让我倒着来打印,这是不是还得有排序呢?

于是阿粉就开始动手了,第一个思路,阿粉第一个想到的就是Collections.reverse()方法,然后刚准备写,面试官笑着说:你给我住手,别想偷懒!

那我们就先来看看使用Collections.reverse()怎么来实现的

Collections.reverse()

public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
    ArrayList<Integer> ret = new ArrayList<>();
    while (listNode != null) {
        ret.add(listNode.val);
        listNode = listNode.next;
    }
    Collections.reverse(ret);
    return ret;
}

这实际上就是一个偷懒的写法,在我们处理链表的时候,把链表的数据加入到 List 中,然后调用 Collections.reverse() 的方法对 List 进行一个反转,这样就相当于是反向的把这个链表给输出出来了。

在这里插入图片描述

这方法实际上是最简单的方法,但是被面试官笑着阻止了,他也知道我想偷懒。

去掉这种简单的实现方法之后,我们就得再考虑其他的实现方式了,毕竟有这个题目,那肯定就不是只有一种解决方案,只不过是考虑那种解决方案比较合适罢了,在日常的工作中也是这样,选择最适合自己项目的方案才是最合适的。

第二种,那就是使用栈的递归策略

栈的特点就是后进先出,始终使用top和pop语句来实现每一个元素的遍历,同时在使用pop和top函数的时候,要先使用empty来判断栈是否为空,在这里使用栈也是相对来说比较合适的。

public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
    Stack<Integer> stack = new Stack<>();
    while (listNode != null) {
        stack.add(listNode.val);
        listNode = listNode.next;
    }
    ArrayList<Integer> ret = new ArrayList<>();
    while (!stack.isEmpty()) {
        ret.add(stack.pop());
    }
    return ret;
}

public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
    ArrayList<Integer> ret = new ArrayList<>();
    if(listNode != null) {
        ret.addAll(printListFromTailToHead(listNode.next));
        ret.add(listNode.val);
    }
    return ret;
}

这时候阿粉绞尽脑汁的想法已经是没有其他的方式来实现了,这时候面试官提问,因为阿粉只能想到这两种方式来实现这个链表倒序打印。

但是面试官对阿粉还是比较柔和的,直接给提示,还有没一种另外一种方法,也能实现链表的倒序呢?这时候面试官,你了解头插和尾插么?于是阿粉灵机一动,发现是呀,还有头插法呀。

头插法和尾插法

头插法:在头结点(为了操作方便,在单链表的第一个结点之前附加一个结点,称为头结点。头结点的数据域可以存储数据标题、表长等信息,也可以不存储任何信息,其指针域存储第一个结点的首地址)之后插入数据,其特点是读入的数据顺序与线性表的逻辑顺序正好相反。

尾插法:将每次插入的新结点放在链表的尾部。

也就是说,可以使用头插法来实现,这样的话,读的顺序正好和逻辑顺序相反,就又出现了一种实现链表倒序打印的方法了呀。既然说,那就得好好实现一下。

public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
    // 头插法构建逆序链表
    ListNode head = new ListNode(-1);
    while (listNode != null) {
        ListNode memo = listNode.next;
        listNode.next = head.next;
        head.next = listNode;
        listNode = memo;
    }
    // 构建 ArrayList
    ArrayList<Integer> ret = new ArrayList<>();
    head = head.next;
    while (head != null) {
        ret.add(head.val);
        head = head.next;
    }
    return ret;
}

这样的话,就简单实现了使用头插法来进行链表倒序打印。

面试官看到阿粉反应这么快,也就没再多说其他的了,至于收没收到 offer,只是说还有两天以后再进行第二面了,阿粉得好好准备一下面试了,不然下次还不知道会问到什么样子的问题呢。

代码参考:

《剑指Offer》

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码