2021 后端开发笔记 22 链表基础练习题

单链表 和 双链表的翻转

链表的属于非常基础的数据结构,但是想要完成好它需要大量的练习,才能够在面试中不慌不乱的写好。

先分享今天听到的一个理论,来自《考试脑科学这本书》中:书中阐述了关于如何将普通的记忆转换成长期记忆。长期记忆的管理员是一个叫海马体的东西,由这个管理员来判断这个记忆是否值得放进长期记忆存储区域。那这个管理员判断的标准是什么呢?

标准是这个东西跟生活的危险有没有关系,你只要被开水壶烫过一次你就会永远记住不能摸开水壶。那么跟生活危险没关系的知识想要进入长期存储区怎么办?那只能去欺骗海马体了。。想要欺骗它你需要的重复练习,一直在管理员面前转悠,这时候管理员就会在想,这人是不是真的有事 啊?要不要放它进去?进去了长期记忆就形成了。

还有一个方法,将自己置于对自己稍微不利的境地(当然这里指的是不太严重的!!),比如说肚子饿的时候,这时候海马体就会把你和危险联系起来,这时候就是背东西的最好时机了!冲冲冲


接下来开始看单链表翻转的练习

首先我们来看看单链表的翻转的代码,然后会画图来解释这个代码是怎么回事:

最简单的链表翻转当然是用java中的容器去做,将链表左右节点都放入容器中,然后反向遍历容器中的元素连接就行了,这样额外空间复杂度是O(n)的,这里就不做代码阐述了。这里主要讲的是如何用额外空间复杂度O(1)去翻转链表。

public class ReverseList {

    public static class Node { // 基本的链表节点声明
        public int value;
        public Node next;

        public Node(int data) {
            value = data;
        }
    }

    public static Node reverseLinkedList(Node head){
        Node pre = null;  // 记录 头节点的 前一个地方 的指针
        Node next = null; // 记录 头节点的 下一个要去的地方 的指针

        while(head != null){
            next = head.next; // 首先 先要记录好头节点的下一个地方,才不至于翻转之后不知道下一个地方要去哪
            head.next = pre; // 然后将 头节点的下一个地方 指向头节点的前一个地方
            pre = head; // 将 记录头节点的前一个地方的指针 移动到头指针的地方
            head = next; // 然后头指针也移动到下一个地方,循环往复直到头指针指向空处
        }
        return pre; // 记住我们要返回的是头指针前一个节点哦!因为头指针最终会指向空
    }
}

①:循环之前我们先准备好两个指针,一个是pre一个是next,pre指向的是head前面的一个节点!!
②:然后开始进入循环,循环的条件是head指向空就终止!!这时候我们先记录head的下一个环境,当head的指针往前指的时候我们就还能找到它下一个节点在哪。
③:这时候将head.next指向他的前一个环境,也就是pre。因为pre是空所以next就置为空了。
④:接下来我们需要做的就是将pre和head向前移动,所以第四歩就是将pre移动到head的位置。
⑤:将head移动到next的地方。

当head指向C的时候循环是不会判断为空的,所以这时候它还会进一次循环,然后指向空,所以最后一个循环的时候pre会指向C,所以我们最终会返回pre当成头节点。

注:图中有些地方画的不准确,为了方便理解。


图解代码流程

接下来是双向链表,代码和单链表一样,只多了一行,用来维护last的代码:

public class ReverseDoubleLinkedList {

    public static class DoubleNode {
        public int value;
        public DoubleNode last;
        public DoubleNode next;

        public DoubleNode(int data) {
            value = data;
        }
    }

    public static DoubleNode reverseDoubleList(DoubleNode head){
        DoubleNode pre = null;
        DoubleNode next = null;

        while(head != null){
            next = head.next;
            head.next = pre;
            head.last = next;
            pre = head;
            head = next;
        }
        return pre;
    }
}

Reference: https://italk.mashibing.com/course/detail/cour_00004003

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,045评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,114评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,120评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,902评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,828评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,132评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,590评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,258评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,408评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,335评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,385评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,068评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,660评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,747评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,967评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,406评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,970评论 2 341

推荐阅读更多精彩内容

  • # LeetCode基础算法-链表 LeetCode 链表 1. 删除链表中的节点 请编写一个函数,使其可以删除某...
    24K男阅读 1,258评论 0 1
  • 线性表 定义:线性表就是数据排成像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向。其实除了数组,链表、...
    竹blue阅读 306评论 0 0
  • 链表定义 有关链表的一些基础函数 给定两个单链表,找出两个链表的公共结点。如果有公共结点,则两个链表一定是Y形重合...
    Mine4ever_阅读 611评论 0 0
  • 目录 基本性质 链表的分类按连接方向分类按照有无循环分类 链表问题代码实现的关键点 链表插入和删除的注意事项 链表...
    kirito_song阅读 2,078评论 0 24
  • 基础编程题 二分搜索 经典二分搜索需要注意的点循环条件 left <= right 还是 left < right...
    霍尔元件阅读 2,856评论 0 2