将单向链表按某值划分成左边小,中间相等,右边大
来源:互联网 发布:大数据平台技术架构图 编辑:程序博客网 时间:2024/04/25 20:15
题目:给定一个单向链表的头结点head,节点的值类型是整型,再给定一个整数privot。实现一个调整链表的函数,将链表调整为左部分都是值小于privot的节点,中间部分都是值等于privot的节点,右部分都是大于privot的节点。
例如:链表9-0-4-5-1,pivot=3。
调整后是1-0-4-9-5,也可以是0-1-9-5-4。
解法1:我们可以利用数组额外空间来实现:
1。先遍历一遍链表,得到链表长度。
2。建立一个链表数组。
3。利用三向快排的划分
4。调整数组中的next值。
代码如下:
class Node{ public int value; public Node next; public Node(int data){ this.value=data; }}public class quicklist { public Node listPartition1(Node head,int privot){ 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; } //调整在数组中的顺序 arrPartion(nodeArr,privot); //调整赋值 for (i = 0; i != nodeArr.length; i++) { nodeArr[i-1].next=nodeArr[i];// } nodeArr[i-1].next=null; return nodeArr[0]; } /** * 三向切分快排一趟交换,需要三个记录量 * @param nodeArr * @param privot */ private void arrPartion(Node[] nodeArr, int privot) { int small=-1; int big=nodeArr.length; int index=0; while (index!=big){ if (nodeArr[index].value<privot){ swap(nodeArr,++small,index++); }else if (nodeArr[index].value==privot){ index++; }else { swap(nodeArr,--big,index); } } } private void swap(Node[] nodeArr, int i, int j) { Node tmp=nodeArr[i]; nodeArr[i]=nodeArr[j]; nodeArr[j]=tmp; }}
解法二:不需要额外空间复杂度的情况下完成调整:
1。将原链表中的所有节点一次划分进三个链表,三个链表分别为small代表左部分,equal代表中间部分,big代表右部分。
例如,链表7-9-1-8-5-2-5,privot=5。在划分之后,small,equal,big分别为:
small:1-2-null
equal:5-5-null
big:7-9-8-null
2。重新串联
3。需要重点判断null。
具体代码这里不予列出。。
0 0
- 将单向链表按某值划分成左边小,中间相等,右边大
- 将单向链表按某值划分成左边小、中间相等、右边大的形式
- 链表问题---将单向链表按某值划分成左边小,中间相等,右边大的形式
- Java——将单向链表按某值划分成左边小、中间相等、右边大的形式(基础问题)
- Java——将单向链表按某值划分成左边小、中间相等、右边大的形式(进阶问题)
- 将单向链表按某个值划分成左边小、中间相等、右边大的形式 Python 版
- 把单链表按某值划分成左边小,中间相等,右边大的形式,时间O(n),空间O(1)
- [JS]链表划分给定中间值,小的在左边,大的在右边并保持原排序
- C++链表划分左边小中间等右边大 时间复杂度O(n) 空间复杂度O(1)
- C++将链表划分为左边小,中间等,右边大于pivotKey的形式
- 将所给数组中的负数安排在左边,零安排在中间,正数安排在右边
- 在数组中 找左边都比其小右边都比其大的元素
- 每日一题(61) - 找出左边比它小,右边比它大的数
- 编写一个算法将顺序表A分成两部分,大于0 的在A的左边,小于0的在A的右边
- 仅用O(1)的空间,将整数数组按奇偶数分成2部分,数组左边是奇数、右边是偶数
- 左边,右边
- 微软100题(93)找出数组中比左边的大比右边的小的元素
- WinForm 窗口出现在靠屏幕左边中间或者右边中间
- 构建c/c++项目时添加宏定义
- STL与泛型编程<六>:map和multimap
- Java反射---获取field信息跟构造函数信息
- 如何快速使用intent广播机制
- 判断一串字符中是否有回文串
- 将单向链表按某值划分成左边小,中间相等,右边大
- 区间覆盖问题
- Linux安装memcache
- 子对象的派生类构造函数以及变量的输入
- Light OJ 1230 Placing Lampposts(简单树形DP)
- linux 下redis php扩展安装、redis服务安装
- Hadoop 1.x 文件中查找TopKey示例
- 第五周 项目一 三角形类雏形(3)
- Java 导入包正确依旧报错的处理方法