关于 两两交换链表中的节点
while (prev.next != nu11 && prev.next.next != nu11)
这边为什么是&& 不是|| 一个是对于偶数个结点的判断 一个是奇数个结点 那不应该是||的关系吗?
奇数节点就不需要交换了,所以只有满足后面有偶数个节点的时候才会进入循环- 循环条件,什么情况应该判断指针本身为空呢?
可以看这个这个遍历的指针最后需要走到哪里 需不需要对最后一个节点做操作 - 三道题套路解决递归问题 | lyl's blog 里面有递归的题解 很好的博客
关于 删除链表的倒数第N个节点
- 链表问题的debug:可以在循环中逻辑执行前打一次输出语句,执行后打一次输出节点值val, 符合你的预期在增加打输出node.next.val(如果你需要知道后面连接是啥),空针就代表你断链了或者其他错误了, 然后这样慢慢增加找, 还有一种就是利用手动画图debug,记得自己学链表的时候经常画图设计简单case边界case来调试,现在写链表的题都是可以脑子有链表图debug了哈哈,可以尝试一下哈各位。
关于 链表相交
- 大家在遇到无法定位头节点,头节点可能被移动删除导致定位失效的时候可以考虑用虚拟头节点,并不是每道题都要用的!!!!
- 指针存的地址,指针一样,指向一个位置,本题要比较的是结点指针不是值
- 不要把值和节点的概念混淆起来 节点是一个实例 占用一块空间 值只是它的成员变量 值怎样和节点本身没有任何关系 一个实例只由它的地址唯一确定!
- 寻找链表相交节点的题,有提到了一种两个指针分别依次走两个链表的思路,其本质上是链表拼接,详情可以参考题解
- 相交链表的数学证明过程
关于 环形链表
- 今天的题目的环形链表大家有一些人不会数学方法的话,这边提供一种只需要数环节点个数的方法哈, 因为保证了fast节点比slow节点间距X个节点(环的节点个数),所以相遇一定会在链表头哈
- 很多同学在 node.next.next空指针,主要原因就是 next可能为null 在用这个之前优先考虑
- 找环形链表的入口时,为什么 n 可以直接取 1 呢?
-
- 我是这样理解的,就是如果相遇前快指针在环中转了不止一圈,比如说转了 5 圈,导致转多圈的原因就是 x 比较长,而环的周长可能比较短。所以最后我们在找入口的时候,两个指针分别从起点和环相遇点开始移动,如果是多圈的情况,那在这个移动过程中从相遇点开始移动的指针也会转多圈,就像公式里写的,x是包含n-1个周长加上 z 的,所以我们可以将这部分在 x 抵消,也就是假设 n 为 1,此时从相遇点开始走的指针也还是在原位出发(省去了转多圈的操作),最后结果还是一样的。