几道链表操作的经典面试题:链表有环、删除节点

1、判断单链表是否有环:

题目描述:判断单链表是否有环?如何找到环的“起始”点?如何知道环的长度?

图解分析:

这里写图片描述

对于有环无环,我们只需要快慢指针,在快指针fast != NULL && fast->next != NULL 成立时,若是能达到快指针与慢指针的再次重逢,则其有环。
对于环的长度、非环段长度、环与非环交点的数据/地址等问题,其主要矛盾在于要发现分析中的关系式,把握住了这个关系式,就能很好解决有环问题的一系列操作,否则处理方式可能就会比较复杂。很早以前,我采用了一个很古老的方式:用指针p来遍历链表,每次遍历一个节点,将p节点的地址存放在一个数组中,在p不等于NULL成立时,每次遍历链表的指针p后移一次,更新并遍历一次数组,若数组中出现重复的地址,表明有环(现在看来复杂度稍大,但这是一个稳扎稳打的方法)。

2、该题目的变形:

题目描述:判断两个单链表是否相交,若两个单链表相交,计算相交点。
这个问题解决方法其实不唯一,而我们根据刚刚解决的单链表是否有环问题,就可以很好解决该问题了。
图解分析:

这里写图片描述

3、删除单链表中给定地址的节点:

问题描述:
给出单链表头指针以及要删除节点的地址,要求写代码删除这上个结点(每个结点数据有限,并且时间复杂度为 O(1),如何实现。

注意本题目中有一个限定:节点数据有限(突破处)。因为我们一般删除指定节点就是释放该节点的内存,而这一点限定就是要打破常规思维。
图解分析:
这里写图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值