Java——将单向链表按某值划分成左边小、中间相等、右边大的形式(基础问题)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_39776901/article/details/78649363

【题目】
  给定一个单向链表的头节点head,节点的值类型是整型,再给定一个整数pivot。实现一个调整链表的函数,将链表调整为左边部分都是值小于pivot的节点,中间部分都是值等于pivot的节点,右边部分都是值大于pivot的节点。除这个要求外,对调整后的节点顺序没有更多的要求。
  例如:链表9->0->4->5->1,pivot=3
  调整后的链表可以使1->0->4->9->5,也可以是0->1->9->5->4。总之,满足左部分都是小于3的节点,中间部分都是等于3的节点(本例中这个部分为空),右部分都是大于3的节点即可。对某部分内部的节点顺序不做要求。

【解法】
  普通解法的时间复杂度为O(N),额外空间复杂度为O(N),就是把链表中的所有节点放入一个额外的数组中,然后统一调整位置,具体代码如下,不作详细解释
  

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

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

    public Node listPartition1(Node head,int pivot){
        if(head == null){
            return head;
        }
        Node cur = head;
        int i = 0;
        while(cur!=null){
            i++;
            cur = cur.next;
        }
        Node[] nodeArr = new Node[i];
        i = 0;
        cur = head;
        for(i=0;i<nodeArr.length;i++){
            nodeArr[i] = cur;
            cur = cur.next;
        }
        arrPartition(nodeArr,pivot);
        for(i=1;i!=nodeArr.length;i++){
            nodeArr[i-1].next = nodeArr[i];
        }
        nodeArr[i-1].next = null;
        return nodeArr[0];
    }

    public void arrPartition(Node[] nodeArr,int pivot){
        int small = -1;
        int big = nodeArr.length;
        int index = 0;
        while(index != big){
            if(nodeArr[index].value < pivot){
                swap(nodeArr,++small,index++);
            }else if(nodeArr[index].value == pivot){
                index++;
            }else{
                swap(nodeArr,--big,index);
            }
        }
    }

    public void swap(Node[] nodeArr,int a,int b){
        Node tmp = nodeArr[a];
        nodeArr[a] = nodeArr[b];
        nodeArr[b] = tmp;
    }   
}

猜你喜欢

转载自blog.csdn.net/qq_39776901/article/details/78649363