24-两两交换链表中的节点
这里还是使用虚拟头节点,这样不需要考虑头节点这个特殊情况了。那该怎么(a,b)两两交换呢?首先我们要找到需要两两交换的前一个节点pro,先让pro指向b,然后让b指向a,最后让a指向b的下一个节点,这样除了我们自己设置的虚拟头节点以外,我们还需要记录三个节点,分别是fir,sec和thr,那么循环何时终止呢?当节点个数是奇数时,就是当我们的pro.next==null;偶数时则是pro.next.next==null。这样终止条件也分析出来了,pro节点在每一循环之后怎么移动呢?当然是向后移动两位。具体我写的代码放到下边。
19-删除链表的倒数第n个节点
题意是删除倒数第n个节点,我第一遍的想法就是先求出有多少个节点sum,然后删除第 sum-n个节点,看完讲解之后我发现我那个方法有点原始人,简单的方法是定义一个虚拟头节点,定义一个快指针,一个慢指针都指向这个虚拟头节点,我们让快指针和慢指针的距离差等于n+1,这样就能保证当快指针指向最后一个节点时,慢指针恰好指向倒数第n+1个节点的位置,这样只需将慢指针.next=慢指针.next.next就可以了
链表相交
这道题真的困扰我挺久也感觉很烦,当时一直在找空指针异常的bug,好吧先说我的思路,首先我们要计算出a链表和b链表的长度,因为链表相交必须是长度相等,计算出长度差,将长链表的头移动长度差个位置,然后进循环,如果两个链表相等则返回a或者b,如果不想等则同时向后移动,如果循环结束还没找到,则返回null
我的问题就是在计算长度之后,没有给a和b重新付值!
142-环形链表2⃣️