题目描述

给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。

你应当保留两个分区中每个节点的初始相对位置。

示例:

输入: head = 1->4->3->2->5->2, x = 3
输出: 1->2->2->4->3->5

思路

1.我们可以设置两个亚结点,分别保存小于和大于等于target的链表结点。
2.在遍历链表时,以target为分界值,循环给front和behind赋值。
3.在遍历结束后,现将behind的末尾置空,然后将front和behind拼接即可。

Java代码实现

    public ListNode partition(ListNode head, int x) {
        ListNode p1 = new ListNode(-1);
        ListNode front = p1;
        ListNode p2 = new ListNode(-1);
        ListNode behind = p2;

        while(head != null){
            if(head.val < x){
                p1.next = head;
                p1 = p1.next;
            }else{
                p2.next = head;
                p2 = p2.next;
            }
            head = head.next;
        }

        //将尾部结点的next置为空,否则可能会存在多余结点
        p2.next = null;
        p1.next = behind.next;
        return front.next;
    }