链表的题目总体来说细节比较多,因为链表的题目在操作链表的过程中本身有些复杂,所以如果链表作为编程题出现的时候,多数情况下题目本身的思路可能不是很复杂,不要把题目往复杂的方向去思考就好了~这里的链表只是说单向链表,双向链表,跳表。树的链表表示形式不属于这个链表的范畴。

1.合并两个有序的链表。额外空间要求O(1)。

思路很明确的一个题目,三个指针。

2.如何判断一个链表中是否存在环?如果存在环,如何快速的找出环的起点位置。

这个题目只要见过一次就很难再忘记它的解题方法了,非常有技巧的一个方法。fast和slow两个指针,如果存在环,两个指针必定会相遇。而且相遇的时候,fast改为逐步前进,slow从头指针位置开始逐步前进,相遇的地方即为环开始的位置。这个可以利用数学知识推导一下。

3.给定一个有序的循环链表和循环链表中的一个任意指针,返回循环链表的中位数(如果是奇数,则返回中位数,如果是偶数,返回上中位数和下中位数的平均值)

有序的循环链表,可以很容易的断定链表开始的位置,最小值。这样可以统计循环链表的长度,然后从开始的位置进行计数。另外一个特殊的边界情况是所有值都相等。

4.判断两个单链表是否相交?如果两个单链表相交,求出相交的第一个节点的位置。

如果两个单链表能够行至相同的尾节点,则必定相交。

求取第一个相交节点的方法需要扫描第一个链表长度L1,第二个链表长度L2,然后将长的链表首先前进max(L1,L2) - min(L1,L2),然后两个链表的指针同时前进,第一个相遇的节点及为相交的节点。

5.如果上述的两个单链表中其中一个存在环或者两个都存在环的情况又该如何处理?

a.如果两个链表都不存在环,则使用上面的方法,

b.如果一个链表存在环,另外一个不存在,则两个链表不相遇,

c.如果两个链表均存在环,并且相遇,则说明两个链表在相遇后共享一个环。

其中这里针对每个链表,找环的方法为题目2,找环开始的位置也为题目2。在c的情况中,判断是否共享环的方法及找到其中一个链表环开始的位置,然后从该位置到该位置进行一次遍历,如果中间存在另外一个链表环开始的位置,则两个链表共享一个环,并且相遇,可以返回任意一个环开始的位置。

共享环的单链表如图:

6.实现一个函数,重新排序链表,新链表结构为偶数节点链表->奇数节点链表->NULL。举例:L0->L1->L2->L3->L4->L5->L6  =>  L0->L2->L4->L6->L1->L3->L5->NULL

操作当前节点的时候保存next pointer至一个临时指针,然后next = next->next,这样偶数就连偶数,奇数就连接奇数了。第一次遇到的奇数保存一个oddhead指针,eventail指针指向oddhead指针,oddtail指针指向NULL,返回evenhead指针。

7.O(1)时间内能够删除一个单链表中给定的节点吗?

针对非尾部节点,有一个小技巧可以应用一下,将给定节点的下一个节点的值copy至该节点,删除给定节点的下一个节点,看起来像是删除了该节点一样。

8.快速取得单链表倒数第K个节点。

fast,slow指针的问题,fast先走k个单位,然后fast和slow指针一起向后,fast达到尾部节点的时候,slow刚好得到倒数第k个节点。

9.单链表的逆序操作(属于单链表的基本操作,应熟练掌握)

10.判断单链表是不是回文结构?

11.针对单链表进行如下操作 L0->L1->L2->...->Ln->NULL  =>  L0->Ln->L1->Ln-1->...Ln/2->Ln/2+1->NULL

这三个题目放在一起的原因是,10,11中将链表的逆序视为基本操作,如果不能实现链表的逆序,则10,11更无从谈起。11题目在leetcode中遇到过,所以思路很清晰,因为11题的思路能够快速的解决10,所以10的思路也很清晰。两个题目在操作之前均需要进行一个中间步骤。

完成链表后半部分的逆序:L0->L1->L2->L3->L4->L5->L6->L7 => L0->L1->L2->L3<-L4<-L5<-L6<-L7,这样就有一个head指针指向L0,一个tail指针指向L7,判断回文需要向中间靠拢即可,

需要11那种重新排序也只需要向中间靠拢即可。

寻找单链表的中位数利用寻找倒数K个节点的方法,然后+上链表逆序完成操作。

12.利用O(1)的额外空间拷贝随机链表。

随机链表指节点除了包含next还包含一个random指向链表中任意一个节点。

如果O(n)时间复杂度,建立一个新旧节点的hash表即可,如果O(1)的时间复杂度,只能采用下面的技巧了。

链表的基础题目学习(EPI)的更多相关文章

  1. 数组和字符串的基础题目学习(EPI)

    学习的速度有些慢,脑袋转动的频率有些不是很高.不过今天的效率我觉得还是可以,应该不能称效率吧,就是整个感觉不错,感觉自己补充了很多的知识.其实G家和F家败了之后不知道看看算法题对接下来的找工作帮助是否 ...

  2. 二叉树的基础题目学习(EPI)

    1.判断是个二叉树是不是平衡二叉树. 二叉树的定义都是利用递归的方法,所以二叉树有着天然的递归属性.所以一般情况下,递归解决二叉树问题中,递归解法比较简洁.平衡二叉树的定义是左子树和右子树均是平衡二叉 ...

  3. 堆的基础题目学习(EPI)

    堆的应用范围也比较广泛,经常游走在各种面试题目之前,不论算法设计的题目还是海量数据处理的题目,经常能看到这种数据结构的身影.堆其实就是一个完全二叉树的结构,经常利用数组来实现.包含最大堆和最小堆两种. ...

  4. python基础练习题(题目 学习使用auto定义变量的用法)

    day28 --------------------------------------------------------------- 实例042:变量作用域 题目 学习使用auto定义变量的用法 ...

  5. .Net程序员之Python基础教程学习----列表和元组 [First Day]

    一. 通用序列操作: 其实对于列表,元组 都属于序列化数据,可以通过下表来访问的.下面就来看看序列的基本操作吧. 1.1 索引: 序列中的所有元素的下标是从0开始递增的. 如果索引的长度的是N,那么所 ...

  6. iOS 面试基础题目

    转载: iOS 面试基础题目 题目来自博客:面试百度的记录,有些问题我能回答一下,不能回答的或有更好的回答我放个相关链接供参考. 1面 Objective C runtime library:Obje ...

  7. 20145308 《网络对抗》Web安全基础实践 学习总结

    20145308 <网络对抗> Web安全基础实践 学习总结 实验内容 本实践的目标理解常用网络攻击技术的基本原理.Webgoat实践下相关实验. 基础问题回答 (1)SQL注入攻击原理, ...

  8. (转)Linux基础知识学习

    Linux基础知识学习 原文:http://blog.csdn.net/ye_wei_yang/article/details/52777499 一.Linux的磁盘分区及目录 Linux的配置是通过 ...

  9. [pwn基础]Pwntools学习

    目录 [pwn基础]Pwntools学习 Pwntools介绍 Pwntools安装 Pwntools常用模块和函数 pwnlib.tubes模块学习 tubes.process pwnlib.con ...

随机推荐

  1. Fedora更改密码

    开机进入单用户模式 按e  --->进入编辑界面之后,在“rhgb quiet”字符前面,输入“single”加空格,回车-->返回上一步中启动命令行菜单. 按 b ---> pas ...

  2. IE10假死/未响应是为什么?

    不知道大家在使用IE10的时候会不会有像是假死一样的情况发生,在打开网页或者进行任何操作都会变得奇慢无比.随着最近在网上看视频的次数越来越多,这个问题越来越突出,越来越频发.于是分析进程的等待链,看看 ...

  3. Gridview中的选择、删除、编辑、更新、取消留着备用。

    后台程序: public partial class tw2 : System.Web.UI.Page{    protected void Page_Load(object sender, Even ...

  4. 小程序中监听textarea或者input输入的值动态改变data中数组的对象的值

    Page({ data: { todoLists:[ { detail:"", date:"", location:"", priority ...

  5. JWT全面解读、使用步骤

    JWT全面解读JWT全面解读前言JWT基本使用在pom.xml引入java-jwt示例如下概念介绍JWT消息构成头部playload标准中注册的声明 (建议但不强制使用)自定义数据签名signatur ...

  6. ABBYY FineReader 12没你想得那么简单

    你是否觉得自己对ABBYY FineReader 12已经了如指掌了?也许你会认为它不过就是一款OCR文字识别软件,能够快速方便地将扫描纸质文档.PDF文件或者数码相机的图像转换为可编辑.可搜索的格式 ...

  7. 常见bootloader介绍

    https://blog.csdn.net/weibo1230123/article/details/82716818 http://fasight001.spaces.eepw.com.cn/art ...

  8. 随笔 -- NIO -- 相关 -- 系统概述

    .打开Selector .打开ServerSocketChannel .获取与此Channel关联的ServerSocket并绑定地址 .设置Channel为非阻塞 .将Channel注册到Selec ...

  9. 8 -- 深入使用Spring -- 2...5 Spring 3.0 新增的注解

    8.2.5 Spring 3.0 新增的注解 @DependsOn @Lazy @DependsOn :用于强制初始化其他Bean.修饰Bean类或方法,可以指定一个字符串数组作为参数,每个数组元素对 ...

  10. (转)base64编码是怎么工作的?

    按:在PHP中级班的课堂上,有位同学问这样一个问题:“我在用 base64_encode 对用户名进行编码时,会出来等号,是不是可以去掉?”跟我来看完这篇文章,答案即揭晓. 1: 为什么需要base6 ...