1.题目概述
以这个题目的事例作为例子,我们看一下这个题目到底是什么意思(Leedcode好多小伙伴说看不懂题目是什么意思),就是比如一个x=3,经过我们的程序执行之后;大于3的在这个链表的后面,小于3的在我们的链表的前面;
2.思路一:在原链表的基础上面进行修改
(1)在原有链表的基础上面,我们判断这个节点的val数值大于或者小于x,大于x的节点往后放(尾插),小于x的节点往前放置(头插);
(2)这个过程实际上并不容易实现,虽然头插尾插并不困难,我们还要让原来的链表结点的next指针指向新的链表节点,这个过程并不容易实现,因此这个方法我们不推荐;
3.思路二:创建一个新的链表
(1)headN是一个哨兵位,用来进行数据的头插,tail用来进行数据的尾部插入;
(2)让原来的链表里面的数据和x进行比较,小于x的进行头部插入,大于x的进行尾部插入;
(3)进行头插的时候,尾指针等于哨兵位就让tail指向尾节点;
(4)这个实际上本质是和第一种方法没有什么差别的,就是我们定义了哨兵位,哨兵位的好处是新的链表一定不是空的链表,我们不需要再第一次插入结点的时候,不用考虑这种特殊情况;
4.思路三:创建两个新的链表
这种做法是官方提供的解题思路,虽然有些浪费空间,但是过程十分明确,不是非常复杂;
下面我们进行分析一下里面的思路方法:
(0)我们给大链表和小链表都设置一个哨兵位和尾部节点,方标我们插入节点;
(1)常见一个小的链表,就是小于x的节点放到这个链表里面去;同理,大于x的节点放到长链表里面去;
(2)我们要进行判断,每次插入数据的时候,大连表和小链表都要移动更新自己的尾部节点的位置,即尾部的节点每次插入一个数据就要是最新插入的数据;
(3)当我们的大连表和小链表都完成之后,我们就要让小链表的尾部节点和大链表的哨兵位的next指向的节点相联结起来;
(4)最后我们应该把大链表的尾部节点指向的区域设置为空指针,如果不设置的话,这个大链表里面的尾部节点指向的还是原来的节点,可能会和小链表里面的某个节点相连接,形成一个环形链表,这样程序会无限制的执行下去,编译器会报错说程序运行超过时间,这个报错的原因就是我们的程序内部出现了死循环;
(5)最后我们返回的时候,要从lesshead这个哨兵位的下一个节点返回,但是哨兵位是我们自己开辟的空间,最后会被释放掉,我们使用ret记住lessnode指向的下一个节点之后释放掉lessnode之后再返回ret就可以了。
总结:官方推荐的第三种方法是有原因的,看似代码比较多,实际上这个方法的思路最清楚,而且没有像前面的两种做法一样涉及很多的细节,很容易初学者理解。