[链表] - 将单向链表按某值划分成左边小、中间相等、右边大的形式
2017-12-19 15:29
295 查看
题目:
给定一个单向链表的头结点head,节点的值类型时整型,再给定一个整数pivot
实现一个调整链表的函数,将链表调整为左部分都是小于pivot的节点,中间部分
都是值等于pivot的节点,右边部分都是大于pivot的节点,出这个要求外,对调整后的
节点顺序没有更多的要求
进阶:
-在原问题的要求智商再增加如下两个要求:
在左中右三个部分的内部也做顺序要求,要求每部分的节点从左到右顺序与
原链表中节点的先后顺序一致。
-如果链表长度为N,时间复杂度达到O(N),额外空间复杂度请达到O(1)
public class Node{
public int value;
public Node next;
public Node(int dta){
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 indedx = 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;
}
给定一个单向链表的头结点head,节点的值类型时整型,再给定一个整数pivot
实现一个调整链表的函数,将链表调整为左部分都是小于pivot的节点,中间部分
都是值等于pivot的节点,右边部分都是大于pivot的节点,出这个要求外,对调整后的
节点顺序没有更多的要求
进阶:
-在原问题的要求智商再增加如下两个要求:
在左中右三个部分的内部也做顺序要求,要求每部分的节点从左到右顺序与
原链表中节点的先后顺序一致。
-如果链表长度为N,时间复杂度达到O(N),额外空间复杂度请达到O(1)
public class Node{
public int value;
public Node next;
public Node(int dta){
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 indedx = 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;
}
相关文章推荐
- 将单向链表按某值划分成左边小、中间相等、右边大的形式
- 将单向链表按某个值划分成左边小、中间相等、右边大的形式 Python 版
- 将单向链表按某值划分成左边小、中间相等、右边大的形式
- 将单向链表按某值划分成左边小、 中间相等、 右边大的形式~迎娶是挺
- 链表问题---将单向链表按某值划分成左边小,中间相等,右边大的形式
- Java——将单向链表按某值划分成左边小、中间相等、右边大的形式(基础问题)
- Java——将单向链表按某值划分成左边小、中间相等、右边大的形式(进阶问题)
- 将单向链表按某值划分成左边小,中间相等,右边大
- C++将链表划分为左边小,中间等,右边大于pivotKey的形式
- 把单链表按某值划分成左边小,中间相等,右边大的形式,时间O(n),空间O(1)
- C++链表划分左边小中间等右边大 时间复杂度O(n) 空间复杂度O(1)
- [JS]链表划分给定中间值,小的在左边,大的在右边并保持原排序
- [JS]链表划分给定中间值,小的在左边,大的在右边并保持原排序
- 划分一个整形数组,把负数放在左边,零放在中间,正数放在右边
- 面试题12 在一个单向链表中 指定一个元素 x 然后将所有小于 x 的元素都放到 x 左边 剩下的元素放到 x 的右边
- C#字符串操作 取文本左边 取文本右边 取文本中间 取文本中间到List集合 指定文本倒序
- C#字符串操作 取文本左边 取文本右边 取文本中间 取文本中间到List集合 指定文本倒序
- 给定一个单向链表(长度未知),请遍历一次就找到中间的指针,假设该链表存储在只读存储器,不能被修改
- 将整型数组划分为左右两部分,使左边全为奇数,右边全为偶数.
- leetcode 724. Find Pivot Index 左右边元素和相等 + 左边右边元素之和 + 动态规划DP