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

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. 安卓开发笔记——打造万能适配器(Adapter)

    为什么要打造万能适配器? 在安卓开发中,用到ListView和GridView的地方实在是太多了,系统默认给我们提供的适配器(ArrayAdapter,SimpleAdapter)经常不能满足我们的需 ...

  2. 简单理解AOP(面向切面编程)

    AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. AOP与OOP是面向不同领域的两种设计思想. ...

  3. DWZ主从表界面唯一性验证(后台验证)(三)

    之前的博客介绍了前台自写js来验证主动表的唯一性,除了前台的验证,我也学习了后台的一些判断. 再次介绍一下背景需求: 利用DWZ的主从表结构批量添加课程信息,在提交表单后,触发Action事件 1.是 ...

  4. yum 安装nginx

    1.下载一个rpm包 wget http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noar ...

  5. SQLServer------基本操作

    代码: --新增字段 ) --编辑字段名称 --注意: 更改对象名的任一部分都可能会破坏脚本和存储过程 EXEC sp_rename 'FTTxUser.[Modifiersss]','Creator ...

  6. virtio-netdev 数据包的发送

    在前面几文中已经大体介绍了virtio的重要组成,包含virtio net设备的创建,vring的创建,与virtio设备的交互方式,我们就从网络数据包的发送角度来看下virtio的详细使用流程. [ ...

  7. 解决SOCKET通信 ERROR_INSUFFICIENT_BUFFER错误

    错误发生在服务端异步收到一个socket连接,之后使用WSAGetLastError()得到的IO错误码是122 这个错误码在系统中的解释是The data area passed to a syst ...

  8. 【代码审计】iZhanCMS_v2.1 后台存在多个SQL注入漏洞分析

      0x00 环境准备 iZhanCMS官网:http://www.izhancms.com 网站源码版本:爱站CMS(zend6.0) V2.1 程序源码下载:http://www.izhancms ...

  9. PHP代码层防护与绕过

    0x01 前言 在一些网站通常会在公用文件引入全局防护代码进行SQL注入.XSS跨站脚本等漏洞的防御,在一定程度上对网站安全防护还是比较有效的. 这里讨论一下关键字过滤不完善及常见正则匹配存在的问题, ...

  10. CMake区分32位64位

    IF(CMAKE_CL_64) set(platform x64) ELSE(CMAKE_CL_64) set(platform x86) ENDIF(CMAKE_CL_64)