穷举所有情况,链接节点

人很蠢,看到题解有人用两个链表,一个链接小的数,一个链接大的数,最后拼接起来就是答案。很妙。但是想不出来,直接讨论出所有情况
1.当最开始就是小于的数的时候,也就是cur==head这个时候需要单独出来讨论。因为我们要保证cur和pre是前后的关系,中间不能有节点。如果不分离出来讨论,和cur!=head的情况使用同一份代码(也就是在链表中间遇到比key小的值的情况) 。会出现cur和pre之间多一个节点。最终导致结果直接为空
2. 剩下的就是理清几个指针的指向关系。暴力还是很容易的,想不出简单办法🤡
3. 一般做链表题还是设置一个虚拟头节点,感觉想起来更容易一点,不然讨论的情况会变得复杂

public class Partition {
    public ListNode partition(ListNode pHead, int x) {
        // write code here

        if(pHead == null) {
            return null;
        }
        ListNode head = new ListNode(0);//虚拟头节点,方便一点
        ListNode resHead = head;//返回节点
        head.next = pHead;
        ListNode cur = head;
        ListNode pre = cur.next;

        while(pre != null) {
            if(pre.val < x){
                if(cur == head){
                    pre = pre.next;
                    cur = cur.next;
                    head = cur;
                }else{
                    ListNode tmp = pre;                
                    cur.next = tmp.next;
                    tmp.next = head.next;
                    head.next = tmp;
                    head = tmp;
                    pre = cur.next;
                }
            }else{
                cur = cur.next;
                pre = pre.next; 
            }

        }
        return resHead.next;
    }
}