1. 本日要讲解的题目是重排列表。首先来看一下题目描述:给定一个单列表,l 的投界点为 L 的,单列表的形式为 L0、L1 一贯到 Ln,然后将其重新排列后变成 L0、Ln、L1、Ln 减 1,然后一贯往下循环。题目还哀求不能只改变节点内部的值,而是要进行实际的节点之间的交流。
2. 通过四例一来看一下这个列表是若何重排的。列表的节点为:1、2、3、4,重排后为 1、4、2、3。可以看到第一个节点重排后还保持在第一个节点,末了一个节点崇拜后变成了第二个节点,原来的第二个节点崇拜后变成了第三个节点,原来的第三个节点崇拜后变成了末了一个节点。
3. 如果给定的不是一个列表,而是一个数组,想达到这种效果可以利用两个指针。第一个指针指向第一个元素,第二个指针指向末了一个元素,然后依次访问两个指针指向的元素。
- 一、四访问完往后把两个指针同时向中间移动,移动完往后再访问两个指针指向的元素。
- 二、三这样就可以得到一个重排后的数组,但是对付列表是有方向的。如果还是定义两个指针,一个指向第一个节点,另一个指向末了一个节点,那么末了一个节点是无法向内移动的。
4. 如果想达到便利宿主的效果,可以把链表一分为二,前半部分链表保持原状,后半部分列表进行反转,把它的后半部分反转往后变为 4、3,这样依然可以定义两个指针。
- 第一个指针指向前半部分列表的第一个节点,第二个指针指向后半部分列表的第一个节点。
- 然后依次访问两个指针指向的节点。
- 一、四访问完往后把指针同时向后移移位,然后连续便利两个指针指向的节点。
- 二、三同时便利完列表的前半部分和后半部分就得到了一个重排后的列表。
5. 下面来看一下若何把一个列表分成两个部分。
- 可以利用快慢指针的方法,针对链表中元素个数为偶数的情形,让慢指针指向第一个元素,快指针指向第二个元素,慢指针和快指针同时移动,慢指针移动一步,快指针移动两步,当前快指针实际上就指向了一个烂接点,快指针没有办法再移动两步,以是认为当前两个指针的移动结束了。当前慢指针指向的节点便是列表第一部分的末了一个节点,慢指针指向的下一个节点便是第二部分的头节点,这个时候就可以把第二部分进行反转,然后利用双指针的接法把两个部分合并在一起,针对列表中元素的个数为基数的情形依旧定义一个慢指针指向第一个节点,一个快指针指向第二个节点,慢指针移动一步,快指针移动两步。
6. 接下来快慢指针还能再移动一次,慢指针移动一步,快指针移动两步,实际上当前指向了一个烂接点。接下来快慢指针没有办法再向后移动,此时慢指针指向第一个节点,慢指针移动一步,快指针移动两步,实际上当前指向了一个烂接点。接下来快慢指针没有办法再向后移动,此时慢指针指向第一个节点,慢指针移动一步,快指针移动两步,实际上当前指向了一个烂接点。接下来快慢指针还能再移动一次,慢指针移动一步,快指针移动两步,实际上当前指向了一个烂接点。接下来快慢指针没有办法再向后移动,此时慢指针指向第一个节点,慢指针移动一步,快指针移动两步,实际上当前指向了一个烂接点。慢指针指向的节点便是第一部分的末了一个节点,慢指针指向的下一个节点便是第二部分的头节点。依然把第二部分进行反转,反转往后把第一部分和第二部分进行合并就得到终极的重排后的列表。
7. 接下来进行编码,编码的过程可以帮助大家更好的理解这个思路。由于前面的视频讲过反转列表,以是这里直接把反转列表的代码给出来了。
- 首先通过快慢指针把列表分成两部分,定义一个慢指针指向列表的头接点,再定一个快指针指向头接点的下一个接点。当快指针不为空并且快指针的下一个指针不为空的时候快指针才能向前走两步,以是以此为条件。
- 当条件知足慢指针和快指针同时向后移,慢指针走一步,快指针走两步,一贯到快指针指向的节点为空或者快指针指向的下一个节点为空,这个时候慢指针指向的下一个节点便是第二部分链表的头节点。
- 就把第二部分的链表进行反转,然后再把两个列表进行分离,也便是把慢指针的下一个节点置为空节点,这样得到了 first 和 second 两段列表。
- 接下来就对 first 和 second 进行合并,通过前面的剖析知道 first 的长度可能跟 second 的长度相等,也可能比 second 多一个接点,以是只须要判断当 second 的部位空的时候就对两个列表进行交替拼接。
- 先保存一下 first 指向的下一个接点,同样的也保存一下 second 的指向的下一个节点。
- 然后把 first 的对应的节点指向 second 的对应的节点,接着再把 second 对应的节点指向 first 的下一个节点。
- 末了把 first 和 second 分别向右移移位,重复上面的过程直到 second 为空就得到了交替合并后的列表。
8. 运行一下代码,提交一下代码。有些同学可能对这个合并的过程还感到有一些陌生,可以在纸上自己动手仿照一下全体过程,可以加深对全体过程的理解。
9. 本日的视频就到这里,感激大家不雅观看。