您的位置:首页 > 编程语言 > Java开发

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

2017-11-27 21:32 363 查看
【题目】

  给定一个单向链表的头节点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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 链表
相关文章推荐