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

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. cocos2dx 2.x 粒子渲染时有黑色粒BUG

    在iPhone6 个别机型会出现 粒子效果黑色不正常现象. ignore = CCParticleSystemQuad:create("particles/flower_red.plist& ...

  2. 软件设计模式之代理模式(JAVA)

    貌似停笔了近半个月了,实在不该啊,新的一年,时刻让自己归零. Back To Zero,就从这篇文章拉开今年的序幕吧. 这篇文章准备介绍下有关代理模式的基本概念和静态代理.动态代理的优缺点及使用方法( ...

  3. 6. go数组与冒泡排序

    include 数组的概念 如何定义数组 数组常用的用法 数组如何指定下标设值 二维数组 冒泡排序 数组 定义数组的格式:var [n] , n>=0 数组长度也是类型的一部分,因此具有不同的长 ...

  4. chrome二维码插件 – w3cways QR Code Generator

    最近研究了下Chrome插件的制作方法,制作了一个二维码插件. 安装方法 方法一:在Chrome应用商店中安装(推荐)点击安装(需FQ) 方法二:本地安装:下载安装包,解压得到w3cways_qrCo ...

  5. python对日志处理的封装

    一个适应性范围较广的日志处理 # coding=utf8 """ @author bfzs """ import os import log ...

  6. LINQ to Entities does not recognize the method 'Int32 ToInt32(System.String)' method, and this method cannot be translated into a store expression

    if (!string.IsNullOrEmpty(FarmWorkId)) { data = data.Where(p => p.TypeId == Convert.ToInt32(FarmW ...

  7. Java单例模式的应用

    单例模式用于保证在程序的运行期间某个类有且仅有一个实例.其优势在于尽可能解决系统资源.通过修改构造方法的访问权限就可以实现单例模式. 代码如下: public class Emperor { priv ...

  8. Dubbo -- 系统学习 笔记 -- 成熟度

    Dubbo -- 系统学习 笔记 -- 目录 成熟度 功能成熟度 策略成熟度 啦啦啦

  9. 8 -- 深入使用Spring -- 3...3 使用Resouce作为属性

    8.3.3 使用Resouce作为属性 当应用程序中的Bean实例需要访问资源时,Spring可以直接利用依赖注入. 如果Bean实例需要访问资源,有如下两种解决方案: ⊙ 在代码中获取Resourc ...

  10. 8 -- 深入使用Spring -- 2...1 搜索Bean类

    8.2.1 搜索Bean类 既然不再使用Spring配置文件来配置任何Bean实例,那么只能希望Spring会自动搜索某些路径下的Java类,并将这些Java类注册成Bean实例. tips:Rail ...