经初步研究发现,所有公司的面试中链表是必考的内容,所以找了些题整理了一下。链表的题型虽然千变万化,很难捉摸,但其中还是有一些共性问题的,在这里选几道简单总结一下。
1. 如何找出单链表的中间节点?
你可以先遍历一次,数一下结点个数。然后结点个数除以2再数一遍。这样做是可以的,但这样的解法与本文的主题无关。本文是要介绍“两个变量”的解法。
1) 定义两个指针fast和slow指向链表头;
2) 在循环体中,fast每次向后移动两个结点,slow移动结点;
3) 当fast到达链表尾时,slow正好位于中间位置。
2.如何找出单链表中倒数第k个节点?
如果是数组就简单了,直接长度除以2取数就可以了。如果是双向链表也行,定义两个指针,一个从头走,一个从尾走,两个相遇点就是中点。但如果是单链表呢,怎么办?
1) 定义两个指针fast和slow指向链表头;
2) 首先,fast向后移动k个结点;
3) 在循环体中,fast和slow每次向后移动一个结点;
4) 当fast到达链表尾时,slow正好位于倒数第k个位置。
3.如何判断单链表中是否有环?
这道题可以用反转法来解决,但按照本文的主题要推荐的是下面这个解法:
1) 定义两个指针fast和slow指向链表头;
2) 在循环体中,fast每次向后移动两个结点,slow每次向后移动一个结点;
3) 如果没有环的话,fast会抵达链表尾,否则fast会追上slow;
4.如何判断两个链表是否交叉?
如果你把两个单链表交叉想成了X形那你就废了。单链表交叉怎么会是X形,应该是Y形才对呀,这下简单了:
1) 定义两个指针a和b分别指向了两个链表头A,B;
2) 遍历A,使a指向尾结点;
3) 遍历B,使b指向尾结点;
4) 如果a==b则交叉,否则不交叉。
5.如何找出两个交叉链表的交叉节点?
两个指针分别指向两个表头,然后依次后移,行么?能相遇在交叉点么?当然不行啦,只有当两个指针到交叉点的距离相同时,依次后移才会在交叉点相遇:
1) 定义两个指针a和b分别指向了两个链表头A,B;
2) 遍历A,得到链表长度La;
3) 遍历B,得到链表长度Lb;
4) 再使指针a和b分别指向了两个链表头A,B;
5) 假设La〉=Lb,使a向后移动La-Lb个结点;
6) 在循环体中,检验a是否等于b,如果相等则返回a;否则a,b后移一个结点;
6. 给定一个单向链表(可能是循环链表)的头指针,如何找出这个链表循环部分的第一个节点?
哪个公司考这么变态的题呀,不想招人就算了,这么找人开涮也太不厚道了。
1) 算法3检验是否有环,如果无环则返回,有环继续;
2) 在算法3停止的位置断开环;
3) 用算法5找出环的第一个结点;
4) 遍历到链表末尾,恢复环。
总结:
以上几道题有一个共同的特点,就是定义两个指针变量,并使其形成特定的位置关系,循环移动之后就能得到想要的结果,这就是这类题的固定模式了。也是本文的标题“两个变量”的由来。
1. 两个指针变量形成移动二倍关系,一个移动到尾部时,那么另一个就在中间;
2. 两个指针变量形成相距k的关系,一个移动到尾部时,那么就在倒数k的位置;
3. 两个指针变量形成快慢关系,如果轨迹是圆环,那么快的就能追上慢的;
4. 两个指针变量都移到可能的交叉点之后的对等位置(到交叉点距离相同),如果变成了同一个指针,那么就是相交的;
5. 两个指针变量找到第一个的对等位置(到交叉点距离相同),再平行移动,那么就能在交叉点相遇;
6. 3 + 5
分享到:
相关推荐
约瑟夫环问题的链表和数组两种解法 设有N个人围坐一圈并按顺时针方向从1到N编号,从第S个人开始进行1到M报数,报到第M个人时,此人出圈,再从他的下一个人重新开始1到M的报数,如此进行下去直到所有的人都出圈为止,...
封装了链表的操作,功能有链表的创建,节点的添加(附加),插入(前插、后插和插入到链表头部),删除,得到节点数据,得到节点位置,得到节点总数,释放链表。 使用了类模版,使得可以让节点中的数据为任意类型,...
利用一个链表类实现一个队列类和栈类
自己编写的链表类,声明和实现 功能: 创建链表,插入节点,删除节点,输出链表,求出链表长度
链表类 c++ 实现的 链表类 c++ 实现的 链表类 c++ 实现的
大一初学C语言时的期末作业,涉及到链表的建立和功能的实现,涉及指针、函数、动态结构建立等方面的知识,初学者可以参考参考尝试尝试哟!!!
C++写的,用链表创建。学生类和班级类。有对链表的创建,插入,删除等操作!
本资源收集了 自己亲身经历的 各大企业笔试中遇到的链表题目,也是企业常常考查的链表题,对正在找工作的同学有很大的帮助。
C语言链表类题目 写函数建立一个有三名学生数据的单项动态链表,很全面,各种测试都试过了,环境VC6.0
C++链表类 模板类 #include #include #include "LinkedList.h" using namespace std; template Node<T> *LinkedList<T>::GetNode(const T& item, Node* ptrNext) //生成新结点 { Node<T> *p; p = new Node...
/* 题目: ... 异质链表实现:有三个类 student,teacher,staff,再定义一个 链表类,此类用来存放这几个不同类的对象,并将链表类 list 声明为所有这些 类的友元,使它们可以访问它们的私有成员。*/
单向链表(一) 结构体、创建链表、遍历链表
Java SE程序 类实现单向链表Java SE程序 类实现单向链表Java SE程序 类实现单向链表Java SE程序 类实现单向链表Java SE程序 类实现单向链表Java SE程序 类实现单向链表Java SE程序 类实现单向链表Java SE程序 类实现...
详细整理了包括单链表、双链表、循环链表的一些经典编程题,单链表为主,例如链表的逆置,删除相同元素,删除指定元素,合并链表,链表排序等等经典算法,注释清晰,入门人士及学习过编程的人均适用。
数据结构,链表所有综合面试题型汇总,有大神漏缺的给我留言
链表类 实现对不同数据的链表操作 数据可以是数 还可以是对象 结构体等等 排序插入可以继承类后加个重载比较运算符进行操作
java实现双链表模拟集合练习题
C++经典基础题(链表
关于链表类的使用