一、链表分割
题目描述:
链接:链表分割
题目分析:
这题直接处理并不好做,我们可以构建前后两个链表,将小于x值的结点放在链表a内,将其它结点放在链表b内,这样将原链表遍历完后,原链表就自然地分成了两部分,最后将两个链表拼接起来就行了。
如果你以为这题到这里就完了,那这题就不会被分在“较难题”里了
做算法题,我们一定要细心,要考虑好程序可能会面临的所有情况,仔细梳理一下,你会发现这道题主要会有四种情况:
1、给定链表为空
2、链表中的值有大于x的,也有小于x的
3、链表中所有结点的值都大于x
4、链表中所有节点的值都小于x
这时问题就很明显了,我们之前的思路只能处理第二种情况,遇到其它情况的时候就会出现问题。
比如在第三种情况下,由于没有小于x的结点,所以链表a的头尾指针都不能指向具体的结点,这时如果再通过a链表的尾节点指向b链表的方式链接,就会出现空指针异常导致程序出错了
因此我们还需要分别处理其它三种情况:
1、因为链表为空,所以不需要处理,直接返回头结点即可
3、此时a链表的头指针应该为空,只需要返回b链表的头结点即可
4、此时b链表为空,正常让a的尾结点指向b的头,直接返回头结点即可
注意:二三种情况时需要将b的尾结点的后驱结点置空,这样才能构建一个正常的单链表
代码实现:
public class Partition {
public ListNode partition(ListNode pHead, int x) {
// write code here
if(pHead==null){
return pHead;
}
ListNode as=null;
ListNode ae=null;
ListNode bs=null;
ListN