第四章_链表_2019-03-21

介绍

1、链表问题算法难度不高,但考察代码实现能力。
2、链表和数组都是一种线性结构。
①数组是一段连续的存储空间。
②链表空间不一定保证连续,为临时分配的。
3、链表分类
①根据指针的方向可以分为单向链表和双向链表
②根据有无循环可以分为普通链表和循环链表

链表问题代码实现的关键点:

1、链表调整函数的返回值往往是节点类型。
2、解决链表问题一定要花时间考虑哪些指针变了,一般可以用画图发辅助解决,在变化指针指向之前要保存环境,以免断线。
3、注意边界条件的处理:头节点、尾节点、空节点等特殊节点的处理

链表插入和删除的注意事项

1、要特殊处理空链表和长度为1的链表
2、插入之前要同时找到插入点之前和之后的位置
3、删除时要注意头尾节点及空节点,需要特殊考虑
4、单链表翻转
①为空和为1时要特殊处理
②大量链表问题可以使用额外数据结构来简化过程,但往往空间复杂度为O(1)即可解决

经典题

  • 已知有序循环单链表,要求插入num并保持有序
    1、如果被插入的链表为空,这node自成循环链表
    2、如果不为空,用prior和current记录从head开始的相邻的两个节点,如果node在它们之间,则插入,否者prior和current指向下一个节点,如果循环一圈仍未找到插入位置,则将节点插入到head和rear之间(这时需要注意头结点的选择)
  • 给定链表中节点node,但头节点未知,如何删除node。要求:时间复杂度为O(1)
    1、如果是双向链表,则可通过prior找到前一个节点,删除比较容易
    2、如果是单向链表,则一般通过替换法解决,即将需要删除节点的值替换为下一个节点的值,然后通过删除下一个节点来等效删除待删节点
    替换法的问题:1)如果需要删除的节点为尾节点,则该方法实效,2)工程上节点比较复杂时,复试节点的开销比较大,3)工程上有些情况禁止使用替换法,因为节点可能为外界提供服务,如果发生替换,则会给外界带来问题。
    替换法的一个不可行的替代方法:当要删除尾节点时,可能会考虑从内存的角度将该区域置空来达到与删除该节点等效的效果,但这是不可行的,因为内存中空是特殊的区域,如果想将某区域置空,则必须找到指向该区域的指针,而本题中这个指针是不可见的。
  • 给定一个链表的的头节点,再给定一个数num,类似于荷兰国旗问题,将小于num的节点放在左边,等于num的节点放在中间,大于num的节点放在右边
    简单做法:将链表所有节点放在一个数组中,然后解决类似于荷兰国旗的问题,最后还得重构链表
    推荐方法:时间复杂度为O(1),将head分为3个链表,三个链表中的元素分别大于,等于和小于num
  • 给定两个有序链表,请打印它们的公共值部分
    1、首先应该判断是否为空,只要有一个链表为空,就返回空
    2、都不为空时,需要同时遍历两个链表,根据当前节点大小来分别调整遍历顺序,这样寻找第一个公共节点,之后输出公共节点,以后只要有一个条链表结束操作结束。
  • 给定单链表,请将该链表以k个节点为单位逆序调整,如果剩余节点不足k个则不做调整
    首先判断:如果链表为空或长度为1或k<2则不需要调整。
    1、时间复杂度为O(n), 空间复杂度为O(k):利用栈积累k个元素后出栈,一直这么继续下去,直到完成逆序
    可能存在的问题有:1)不足k,如何处理,2)后一组需要和之前组连接,而第一组不需要,所以要特殊处理第一组,3)每一组出栈后需要链表next指针重连操作,4)整个功能会改变链表头节点,所以函数需要返回节点类型,最后返回调整后的头节点
    2、时间复杂度为O(n),空间复杂度为O(1):这个方法和方法一类似,但是此处不借助栈实现,实现更复杂点
  • 给定链表头head,和数number,把所有等于number的节点删掉
    整个过程看成构造链表的过程,只接值不等于number节点,此题要考虑边界情况
  • 判断一个链表是否为回文
    1、空间复杂度O(n):申请一个栈,遍历链表并将值入栈,遍历完成后,进行出栈,出栈同时重新遍历遍历链表,比较每个出栈值和遍历的当前节点是否相等,如果有一个不等就不是回文。
    2、空间复杂度O(n / 2):申请一个栈,这次需要两个指针遍历链表,慢指针步长为1,快指针步长为2,慢指针遍历到的节点值要同时入栈,1)当链表有奇数个节点时,快指针到达尾节点表示慢指针到达中间节点,将中间节点出栈后的剩余节点出栈的同时慢指针继续遍历链表比较每个出栈值和遍历的当前节点是否相等,如果有一个不等就不是回文。2)当链表有偶数个节点时,快指针到达尾节点的前一个节点即表示慢指针到达中间节点,此时开始出栈操作,节点出栈的同时慢指针继续遍历链表比较每个出栈值和遍历的当前节点是否相等,如果有一个不等就不是回文。
    3、空间复杂度为O(1):还需要两个指针遍历链表,慢指针步长为1,快指针步长为2,1)当链表有奇数个节点时,快指针到达尾节点表示慢指针到达中间节点,此时将链表的右半部分逆序,然后同时从头结点和尾节点开始遍历链表,比较当前节点是否相等,如果有一个不等就不是回文。2)当链表有偶数个节点时,快指针到达尾节点的前一个节点即表示慢指针到达中间节点,此时将链表的右半部分逆序,然后同时从头结点和尾节点开始遍历链表,比较当前节点是否相等,如果有一个不等就不是回文。
  • 复制含有random指针的链表,含有random指针是指,链表中除了含有指向下一个节点的next指针外还含有指向任意节点的random指针。
    1、如果链表为空直接返回空
    2、如果不为空,我们在遍历链表的同时复制每个节点,并把它们连在该节点和下一个节点之间,再次遍历链表利用这个特殊对应关系就可找到在复制的链表中random该指向哪个节点
  • 判断单链表是否有环,如果环就返回第一个入环节点,如果无环就返回空。要求:时间复杂度为O(n),空间复杂度为O(1)
    1、如果没有空间复杂度的限制:此时用hash表解决,具体为:依次让节点入hash,如果过程中发现hash中已经存在这个键,那么说明有环,且第一个重复出现的键所代表的节点就是第一个入环节点。
    2、本题解法:用快慢指针遍历链表。如果链表有环,那么快慢指针一定会在环中某个位置相遇,当快慢指针相遇时,让快指针再从头结点重新遍历链表,当它和慢指针再次相遇,那么遇上的这个节点就是第一个入环节点。
  • 判断两无环单链表是否相交,如果相交则返回第一个相交节点,如果不相交则返回空。要求:时间复杂度O(m + n),空间复杂度O(1)
    1、如果无空间复杂度限制:用hash解决,具体就是先将一条链入hash,然后遍历另一条链,遍历过程中在hash表中查找该节点表示的键是否已经在hash表中出现,第一个重复出现的键即为第一个相交节点,无相交节点则不相交
    2、本题思路:遍历这两条链,统计各自长度为m、n,假设m >= n,则让长度为m的链先遍历m - n个节点,再和长度为n的节点同步遍历,如果遍历过程中出现相同节点,那么出现的第一个相同节点就是头一个相交节点。
  • 判断连个有环单链表是否相交,如果相交则返回第一个相交节点,,如果不相交则返回空。要求:时间复杂度O(m + n),空间复杂度O(1)
    1、第一种情况是:两个链有相同的入环节点,利用“ 判断两无环单链表是否相交……”的方法,与之不同的是在统计长度时,此处应以两链表的入环节点为结束点。
    2、第二种情况是:两个链有不同的入环节点,这种情况分两个情况:1)两个链的环是重叠的,只不过入环点不是同一个节点,此时采用“判断单链表是否有环……”的方法,返回其中任意一条链的入环节点即可。2)两条链的环不重叠,此时不存在相交节点。
  • 给定两单链表,判断是否相交,如果相交则返回第一个相交节点,如果不相交则返回空。
    1、先判断有环无环,有环链和无环链一定不相交(无环单链表如果相交,那么尾节点一定是同一个节点)
    2、如果都无环,则判断无环单链表是否相交。
    3、如果都有环,则判断有环单链表是否相交。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,569评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,499评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,271评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,087评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,474评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,670评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,911评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,636评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,397评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,607评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,093评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,418评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,074评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,092评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,865评论 0 196
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,726评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,627评论 2 270

推荐阅读更多精彩内容

  • 一些概念 数据结构就是研究数据的逻辑结构和物理结构以及它们之间相互关系,并对这种结构定义相应的运算,而且确保经过这...
    Winterfell_Z阅读 5,535评论 0 13
  • 搞懂单链表常见面试题 Hello 继上次的 搞懂基本排序算法,这个一星期,我总结了,我所学习和思考的单链表基础知识...
    醒着的码者阅读 4,524评论 1 45
  • 有头链表(注意:头结点有的地方是全局变量) 初学者学自于大话数据结构,不足及错误的地方请读者提出来,谢谢。 可加 ...
    lxr_阅读 741评论 0 2
  • 摘自《维基百科》 链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储...
    ChinaChong阅读 1,645评论 0 52
  • 一、线性表的顺序存储设计与实现(顺序表) 1.1 顺序存储结构的设计原理概要 顺序存储结构底层是利用数组来实现的,...
    千涯秋瑟阅读 1,357评论 2 4