小知识点的总结

参数检测:

  • 有些情况下使用assert:该种问题如果发生,程序是一种错误—除法的除数为0
  • 有些情况下使用if判断:该总问题如果发生,程序是一种正常的情况-…->比如:空链表-…>合法的链表,只不过链表中没有节点而已

对于链表的基本操作中,那些方法需要传递二级指针,那些方法需要传递一级指针?
本质:在函数体中是否需要通过形参指针改变外部实参指针的指向
需要:函数的参数必须为二级指针,比如:所有的插入、删除、销毁。。。
不需要:函数的参数只需要传递一级指针,比如:查找、获取有效个数节点。。

1、如何检测链表是否带环?

  • 不带环:最后一个节点的next指向NULL
  • 带环:最后一个节点的next指针域指向了该链表中的某一个节点
  • 求解方式:
    设置两个指针fast和slow来遍历链表fast每次走两步,slow每次走一步,两个指针在遍历链表时,每走一次检测fast和slow是否为同一个节点
    如果链表不带环: fast指针就会走到链表的末尾后者最后一个节点的位置
    如果链表带环: fast和slow两个指针最终就会在环内的某个节点的位置相遇

2、快指针走3.4部,慢指针走一步,是否可以判环?
不行。

在这里插入图片描述

3、为什么快指针每次走2步,慢指针每次走1步可以?

  • fast走的快,先进入快然后绕圈slow走的慢,后进入的环
    每走一次,fast和slow之间的节点个数fast减少了一个节点
    最后fast快指针肯定会将slow指针追上
    注意: slow进环之后,在slow绕环一周之内fast肯定是可以追上slow

4、求环的入口点
求环的入口点:给两个指指针pH和pM
pH从链表起始节点开始,pM从相遇点的位置开始遍历链表,两个指针每次各走一步
最终pH和pM肯定会在入口点的位置相遇

链表相交求交点?

1、假设链表不带环:

  • 让L2最后一个节点指向L1链表的某个节点 在这里插入图片描述

  • 让L2中最后一个节点指向L1中最后一个节点在这里插入图片描述

  • 让L2中最后一个节点指向L1的首节点 在这里插入图片描述

  • 从上图可以看出:只要链表相交,从交点(两个链表中第一个公共的节点)到链表的末尾的所有节点都是相同的。
  • 判断链表相交方式:分别找到两个链表中的最后一个节点,然后检测该节点的地址是否相同(注意:不是检测节点中的值)
    相同:则相交
    不相同:不相交
  • 求交点:给两个指针p1和p2,让其分别指向链表的起始节点,然后让指向较长链表的指针先往后移动两个链表节点个数差值步,再让p1和p2同时往后移动,每遇到一个节,检测p1和p2地址是否相同即可,如果不同两个指针继续往后移动,如果相同则该节点即为交点

2、假设链表带环

  • 两个链表都不带环:参考不带环场景
  • 一个链表带环,一个不带环:一定不会相交
  • 两个链表都带环:分为相交和不相交 相交:
    1>环外相交

求交点:
方式一---->借助不带环链表相交求交点的方式
将相遇点pM认为是L1和L2两个的终点
L1到pM及L2到pM位置节点的个数size1和size2
然后给一个两个指针p1和p2,分别指向L1和L2首节点的位置让长节点个数先往后移动差值步,最后两个指针同时往后移动结果肯定会在交点的位置相遇
在这里插入图片描述
方式二:
1.pM的next不要指向pMNext,让pM的next指向两个链表中任意一个链表的首节点,比如L2 2、链表中形成了一个新的环---->以前的交点现在成了新环的入口点
3.求原L1和L2的交点E,就变成求新环的入口点在这里插入图片描述

2>环内相交
在这里插入图片描述
交点可以是E1也可以是E2,最终变为求环的入口点
都带环,如何判断相交?
两个链表都带环且相交,两个链表一定共用一个环
判环期间得到两个相遇点,如果相交则两个相遇点在同一个环中:给一个指针让其从一个相遇点的位置绕环一周,检测是否遇到另外一个相遇点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值