将单向链表按某值划分为左边小、中间相等、右边大的形式
1)将链表放入数组里,在数组上做partition(类似快排),这是笔试时推荐的写法
2)分为小、中、大三部分,再把各个部分之间串起来,这个是面试推荐使用的。
我们这里重点介绍第二种方法

sH:小于value部分的头
sT:小于value部分的尾
eH:等于value部分的头
eT: 等于value部分的尾
bH:大于value部分的头
bT:大于value部分的尾,这个如果不需要保证稳定性的时候可以不要。
代码实现:
package dataStructure.linkedList.practice;
import dataStructure.linkedList.Node;
public class SplitByValue {
    /**
     * 根据value把原来的链表改变为左边小于value、中间相等value、右边大于value的形式
     * @param head  原链表的头节点
     * @param value 设定的划分值
     * @return 返回新链表的头结点
     */
    public static Node<Integer> split(Node<Integer> head, int value) {
        /**
         * sH:小于value部分的头 
         *
         * sT:小于value部分的尾
         *
         * eH:等于value部分的头
         *
         * eT: 等于value部分的尾 
         *
         * bH:大于value部分的头
         *
         * bT:大于value部分的尾,这个如果不需要保证稳定性的时候可以不要。
         */
        Node sH = null;
        Node sT = null;
        Node eH = null;
        Node eT = null;
        Node bH = null;
        Node bT = null;
        while(head != null) {
            Node next = head.next;
            if(head.value < value) {
                if(sT == null) {
                    sH = head;
                    sT = head;
                } else {
                    sT.next = head;
                    sT = head;
                }
            } else if(head.value == value) {
                if(eT == null) {
                    eH = head;
                    eT = head;
                } else {
                    eT.next = head;
                    eT = head;
                }
            } else {
                if(bT == null) {
                    bH = head;
                    bT = head;
                } else {
                    bT.next = head;
                    bT = next;
                }
            }
            head.next = null;
            head = next;
        }
        //每个元素都划分完毕区间之后,现在开始连接各个区间
        //如果sT不为null,说明小于区间有值
        if(sT != null) {
            sT.next = eH;
            //不管什么时候都用eT来连接bH,但是等于区间可能没有值,
            // 这个时候我们把小于区间的尾赋值给等于区间的尾
            eT = eT == null? sT : eT;
        }
        //eT不为null有两种情况:1.等于区间有值,eT就是等于区间的尾 2.等于区间无值,eT就是小于区间的尾
        //两种情况我们都使用eT.next = bH来连接大于区间,这里无需考虑bH是否为空
        if(eT != null) {
            eT.next = bH;
        }
        //如果小于区间的头不为空,返回小于区间的头
        //如果小于区间头为空且等于区间的头不为空,返回等于区间的头
        //其他情况返回大于区间的头
        return sH != null? sH : eH != null? eH: bH;
    }
    public static void main(String[] args) {
        Node n1 = new Node(3);
        Node n2 = new Node(5);
        Node n3 = new Node(2);
        Node n4 = new Node(4);
        Node n5 = new Node(3);
        Node n6 = new Node(3);
        n1.next = n2;
        n2.next = n3;
        n3.next = n4;
        n4.next = n5;
        n5.next = n6;
        Node newHead = split(n1,3);
        while(newHead != null) {
            if(newHead.next != null) {
                System.out.print(newHead.value + "->");
            } else {
                System.out.print(newHead.value);
            }
            newHead = newHead.next;
        }
    }
}
运行结果:
2->3->3->3->5->4
 Process finished with exit code 0
欢迎批评指正


















