链表面试常见合集

给定单链表,检测是否有环。如果有环,则求出进入环的第一个节点。

判断单向链表是否有环,可以采用快指针与慢指针的方式来解决。即定义一个快指针fast和一个慢指针slow,使得fast每次跳跃两个节点,slow每次跳跃一个节点。如果链表没有环的话,则slow与fast永远不会相遇(这里链表至少有两个节点);如果有环,则fast与slow将会在环中相遇。
然后获取环的入口点方法如图所示:

给定两个单链表(链表自身无环),检测两个链表是否有交点,如果有返回第一个交点。

检测两个单链表是否有交点是很容易的,因为如果两个链表有交点,那么这两个链表的最后一个节点必须相同,所以只需比较最后一个节点即可。但是这种方案是无法求出第一个交点的,所以需要另辟蹊径。另外,判断是否有交点可以转换成链表是否有环的问题。让一个链表的最后一个节点指向第二个链表的头结点,这样的话,如果相交,则新的链表是存在环的,并且交点便是环的入口点。

给定两个单链表(不确定是否带环),判断是否有交点

先判断两个链表是否带环;
  i).如果两个都不带环,可以用:判断两个无环单链表是否有交点。
  ii).两个都带环:找到两个入环点r1,r2,环1的入环点为r1,从r1开始遍历一圈,每个结点如r2比较
  iii).一个带环一个不带环,则肯定不相交。

给定单链表头结点,删除链表中倒数第k个结点

这个问题的关键是需要获取倒数第k个节点。如何获取呢?这里,需要两个指针p和q,p指向头结点,q指向距离头结点为k的节点。这样p和q每次遍历一个节点,当q遍历到末尾的时候,p指向的节点即为倒数第k个节点,然后删除即可。

只给定单链表中某个结点p(并非最后一个结点,即p->next!=NULL)指针,删除该结点;

只给定单链表中某个结点p(非空结点),在p前面插入一个结点。

上诉两种方法的原理都是一样的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.把二元查找树转变成排序的双向链表 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不...
    曲终人散Li阅读 3,371评论 0 19
  • MVC 具有什么样的优势,各个模块之间怎么通信,比如点击 Button 后 怎么通知 Model? [iOS] M...
    kidzss阅读 4,305评论 1 37
  • MVC 具有什么样的优势,各个模块之间怎么通信,比如点击 Button 后 怎么通知 Model?[iOS] MV...
    Lost_693d阅读 160评论 0 1
  • 推荐大家看下《编程之美》、《程序员面试金典》 还有编程相关网站:leetcode老师讲的很多题其实就是这些书和网...
    偷天神猫阅读 1,292评论 0 6
  • 问题定义 两个单向链表的头指针,两个链表都可能带环1: 判断这两个链表是否相交2: 如果相交,给出他们相交的第一个...
    HITMiner阅读 4,308评论 3 2