链表的划分

声明: 本总结仅为个人学习总结,以防止遗忘而作,不得转载和商用。
题目:给定一个单链表和数值x,划分链表使得所有小于x的节点排在大于等于x的节点之前。你应该保留两部分内链表节点原有的相对顺序。
样例:
给定链表 1->4->3->2->5->2->null,并且 x=3,返回 1->2->2->4->3->5->null
分析:
分别申请两个指针p1和p2,小于x的添加到p1中,大于等于x的添加到p2中;最后,将p2链接到p1的末端即可
时间复杂度O(N),空间复杂度O(1)
Java版本的实现:

public static void partition(Node pHead, int pivotKey){
        //两个链表的头指针
        Node pLeftHead = new Node(0);
        Node pRightHead = new Node(0);
        //两个链表的当前最后一个元素
        Node left = pLeftHead;
        Node right = pRightHead;
        Node p = pHead.next;
        while (p != null) {
            if (p.value < pivotKey) {
                left.next = p;
                left = p;
            }else {
                right.next = p;
                right = p;
            }
            p = p.next;
        }
        //将right链接到left尾部
        left.next = pRightHead.next;
        right.next = null;
        //将整理好的链表赋值给当前链表头部
        pHead.next = pLeftHead.next;
    }

测试代码:

        int datas[] = {1,4,3,2,5,2};
        Node pH = new Node(0);
        for(int i = datas.length-1;i>=0;i--){
            Node pNode = new Node(datas[i]);
            pNode.next = pH.next;
            pH.next = pNode;
        }
        printLinkedList(pH);
        partition(pH, 3);
        printLinkedList(pH);

结果:
Linked List: 0->1->4->3->2->5->2->
Linked List: 0->1->2->2->4->3->5->

你可能感兴趣的:(链表的划分)