将单向链表按某值划分成左边小中间相等右边大的形式

  • 把链表放入数组里,在数组上做 partition(笔试用)
  • 分成小、中、大三部分,再把各个部分之间串起来(面试用)
package size;

public class SmallerEqualBigger {
    /**
     * 将单向链表按某值划分成左边小、中间相等、右边大的形式
     * <p>链表直接实现:分成小、中、大三部分,再把各个部分之间串起来</p>
     *
     * @param root  head
     * @param pivot 比较值
     *
     * @return 划分后的链表
     */
    public static Node listPartition(Node root, int pivot) {
        // head -> 小于/等于/大于
        Node sH = null, eH = null, mH = null;
        // tail -> 小于/等于/大于
        Node sT = null, eT = null, mT = null;
        // 下一个指针
        Node next;
        while (root != null) {
            next = root.next;
            root.next = null;
            if (root.value < pivot) {
                if (sH == null) {
                    sH = root;
                } else {
                    sT.next = root;
                }
                sT = root;
            } else if (root.value > pivot) {
                if (mH == null) {
                    mH = root;
                } else {
                    mT.next = root;
                }
                mT = root;
            } else {
                if (eH == null) {
                    eH = root;
                } else {
                    eT.next = root;
                }
                eT = root;
            }
            root = next;
        }
        // 将三个链表链接起来
        if (sT != null) {
            sT.next = eH;
            eT = eT == null ? sT : eT;
        }
        if (eT != null) {
            eT.next = mH;
        }
        return sH != null ? sH : (eH != null ? eH : mT);
    }

    public static class Node {
        public int value;
        public Node next;

        public Node(int data) {
            this.value = data;
        }
    }
}

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!

链表常见题(5)-环 上一篇
链表常见题(3)-克隆链表 下一篇