LinkLists 把一个链表根据一个值分成两半 @CareerCup
来源:互联网 发布:什么是网络金融诈骗 编辑:程序博客网 时间:2024/06/09 23:50
Write code to partition a linked list around a value x, such that all nodes less than x come before all nodes greater than or equal to x.
写代码把一个链表根据值x分成两块,来使得所有小于x的节点都在大等于x的节点的前面。
例如:
1->3->7->5->2->9->4 按照5来分 变成:
1->3->2->4->7->5->9 这样所有小于5的都在大等于5之前了
思路:
建立两个链表,第一个存放比x小的节点,第二个存放大等于x的节点。
最后合并两个链表。这样做法还是in place的
package LinkLists;import CtCILibrary.LinkedListNode;public class S2_4 {// 建立两个链表,第一个存放比x小的节点,第二个存放大等于x的节点public static LinkedListNode partition(LinkedListNode node, int x) {LinkedListNode beforeStart = null;// 第一个链表开始位置LinkedListNode beforeEnd = null;// 第一个链表结束位置LinkedListNode afterStart = null;// 第二个链表开始位置LinkedListNode afterEnd = null;// 第二个链表结束位置while (node != null) {LinkedListNode next = node.next;// 保存下一个节点node.next = null;// 断开当前节点和下一个节点连接if(node.data < x) {// 小的被分到第一个链表if(beforeStart == null) {// 链表还没建时beforeStart = node;beforeEnd = beforeStart;} else{// 链表已经存在时beforeEnd.next = node;beforeEnd = node;}} else{// 大的被分到第二个链表if(afterStart == null) {afterStart = node;afterEnd = afterStart;} else{afterEnd.next = node;afterEnd = node;}}node = next;}if(beforeStart == null) {// 所有的节点都大于xreturn afterStart;}beforeEnd.next = afterStart;// 连接两个链表return beforeStart;}// 另一种方法,书中说的是能避免使用多个变量。// 但我觉得这种方法没什么意义,因为这种方法反而会更慢些,而且合并出来的也不是stable的// 为了完整性,也把这种解法附在这里。思想是链表的头插代替上面的尾插public static LinkedListNode partition2(LinkedListNode node, int x) {LinkedListNode beforeStart = null;LinkedListNode afterStart = null;/* Partition list */while (node != null) {LinkedListNode next = node.next;if (node.data < x) {/* Insert node into start of before list */node.next = beforeStart;beforeStart = node;} else {/* Insert node into front of after list */node.next = afterStart;afterStart = node;}node = next;}/* Merge before list and after list */if (beforeStart == null) {return afterStart;}LinkedListNode head = beforeStart;while (beforeStart.next != null) {beforeStart = beforeStart.next;}beforeStart.next = afterStart;return head;}public static void main(String[] args) {/* Create linked list */int[] vals = {1, 3, 7, 5, 2, 9, 4};LinkedListNode head = new LinkedListNode(vals[0], null, null);LinkedListNode current = head;for (int i = 1; i < vals.length; i++) {current = new LinkedListNode(vals[i], null, current);}System.out.println(head.printForward());LinkedListNode clone = head.clone();/* Partition */LinkedListNode h = partition(head, 5);LinkedListNode h2 = partition2(clone, 5);/* Print Result */System.out.println(h.printForward());System.out.println(h2.printForward());}}
0 0
- LinkLists 把一个链表根据一个值分成两半 @CareerCup
- LinkLists 删除链表中的一个给定指针的结点 @CareerCup
- LinkLists 检查一个链表是否为回文 Check if a linked list is palindrome @CareerCup
- LinkLists 两个链表相加 @CareerCup
- CDR中如何把一个字分割成两半
- 一个数组由2n个整数组成,把这个数组分成两半,各有n个整数,求一个分法,使这两个子数组和的差最小
- LinkLists 找链表环入口 @CareerCup
- 把一个完全图分成两部分
- 如何把一个盘剩余的空间分成一个区
- Arrays_Strings 把一个矩阵置为0 @CareerCup
- 把一个整数划分成若干个质数的和
- poj 1523 求割点把一个图分成几个联通部分
- AMDD 一个把大问题分成小问题的优化算法
- 把一个listmap 按照要求分成两个listmap
- parted/fdisk/blkid(如何把整个盘分成一个区)
- LinkLists 乱序链表中移除重复的项 @CareerCup
- Hdu 5785 Interesting(给你一个字符串,你可以选择这个字符串的一个子串,记为s[l...r] 你可以选择一个k(i<=k< j)将这个子串划分成两半,如果这两半都是回文串,那么答案)
- 如何把一个1:3的矩形分成若干份,然后拼成一个正方形
- 十五分钟介绍 Redis数据结构
- ACMer 的三个阶段
- C语言中char转换成int
- java:奇数阶幻方
- MFC中的HOOK编程
- LinkLists 把一个链表根据一个值分成两半 @CareerCup
- 坚持还是妥协?乔布斯留给产品经理的选择题
- HDU 1176
- 结合apache和tomcat实现多域名、多端口绑定
- 深度文件夹锁
- Android 屏幕常亮
- 序言
- java简单编程思想
- 线段树 递归 基本操作