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),就是把链表中的所有节点放入一个额外的数组中,然后统一调整位置,具体代码如下,不作详细解释
给定一个单向链表的头节点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——将单向链表按某值划分成左边小、中间相等、右边大的形式(进阶问题)
- 链表问题---将单向链表按某值划分成左边小,中间相等,右边大的形式
- 将单向链表按某个值划分成左边小、中间相等、右边大的形式 Python 版
- 将单向链表按某值划分成左边小、中间相等、右边大的形式
- 将单向链表按某值划分成左边小、 中间相等、 右边大的形式~迎娶是挺
- [链表] - 将单向链表按某值划分成左边小、中间相等、右边大的形式
- 将单向链表按某值划分成左边小、中间相等、右边大的形式
- 将单向链表按某值划分成左边小,中间相等,右边大
- 把单链表按某值划分成左边小,中间相等,右边大的形式,时间O(n),空间O(1)
- C++将链表划分为左边小,中间等,右边大于pivotKey的形式
- C++链表划分左边小中间等右边大 时间复杂度O(n) 空间复杂度O(1)
- [JS]链表划分给定中间值,小的在左边,大的在右边并保持原排序
- [JS]链表划分给定中间值,小的在左边,大的在右边并保持原排序
- java c# 基础总结的,中间还有问题
- 面试题12 在一个单向链表中 指定一个元素 x 然后将所有小于 x 的元素都放到 x 左边 剩下的元素放到 x 的右边
- java基础中Integer值用==和equals判断相等问题解析
- java基础之面试篇四-单向链表和双向链表区别
- 划分一个整形数组,把负数放在左边,零放在中间,正数放在右边
- Java面向对象基础--实现单向链表
- 单向链表的反转是一个经常被问到的一个面试题,也是一个非常基础的问题。比如一个链表是这样的: 1->2->3->4->5 通过反转后成为5->4->3->2->1。