将单向链表按某值划分成左边小、中间相等、右边大的形式
来源:互联网 发布:如何考上清华知乎 编辑:程序博客网 时间:2024/03/29 19:55
import java.util.LinkedList;import java.util.Queue;//将单向链表按某值划分成左边小、中间相等、右边大的形式public class DivideList{ //链表节点的定义public static class Node{public int value;public Node next;public Node(int data) { this.value=data; }}//将单向链表值进行划分public static Node Dividelist(Node head,int pivot){if(head==null){return head;}Node p=head;Queue <Node>queue1=new LinkedList<Node>(); //存储比pivot大的数Queue <Node>queue2=new LinkedList<Node>(); //存储和pivot小的数Queue <Node>queue3=new LinkedList<Node>(); //存储和pivot相等的数while(p!=null){if(p.value>pivot){ queue1.offer(p);}else if(p.value<pivot) { queue2.offer(p); } else { queue3.offer(p); } p=p.next;} Node t=head;while(!queue2.isEmpty()){System.out.print(queue2.poll().value+" ");//t.value=queue2.poll().value;//t=t.next;}while(!queue3.isEmpty()){System.out.print(queue3.poll().value+" ");//t.value=queue3.poll().value;//t=t.next;}while(!queue1.isEmpty()){System.out.print(queue1.poll().value+" ");//t.value=queue1.poll().value;//t=t.next;} return head;} //进阶方法 需要时间复杂度O(N),空间复杂度为O(1) public static Node Dividelist2(Node head, int pivot) {Node sH = null; // small headNode sT = null; // small tailNode eH = null; // equal headNode eT = null; // equal tailNode bH = null; // big headNode bT = null; // big tailNode next = null; // save next node// every node distributed to three listswhile (head != null) {next = head.next;head.next = null;if (head.value < pivot) {if (sH == null) {sH = head;sT = head;} else {sT.next = head;sT = head;}} else if (head.value == pivot) {if (eH == null) {eH = head;eT = head;} else {eT.next = head;eT = head;}} else {if (bH == null) {bH = head;bT = head;} else {bT.next = head;bT = head;}}head = next;}// small and equal reconnectif (sT != null) {sT.next = eH;eT = eT == null ? sT : eT;}// all reconnectif (eT != null) {eT.next = bH;}return sH != null ? sH : eH != null ? eH : bH;}//打印链表public static void PrintList(Node head){while(head!=null){ System.out.print(head.value+" "); head=head.next;}System.out.println();}public static void main(String []args){ //System.out.println("Hello"); Node node=new Node(9); node.next=new Node(0); node.next.next=new Node(4); node.next.next.next=new Node(5); node.next.next.next.next=new Node(1); PrintList(node); //Node mode=Dividelist1(node,3); Node mode=Dividelist2(node,3); PrintList(mode);}}
阅读全文
0 0
- 将单向链表按某值划分成左边小、中间相等、右边大的形式
- 链表问题---将单向链表按某值划分成左边小,中间相等,右边大的形式
- 将单向链表按某值划分成左边小,中间相等,右边大
- Java——将单向链表按某值划分成左边小、中间相等、右边大的形式(基础问题)
- Java——将单向链表按某值划分成左边小、中间相等、右边大的形式(进阶问题)
- 将单向链表按某个值划分成左边小、中间相等、右边大的形式 Python 版
- 把单链表按某值划分成左边小,中间相等,右边大的形式,时间O(n),空间O(1)
- C++将链表划分为左边小,中间等,右边大于pivotKey的形式
- [JS]链表划分给定中间值,小的在左边,大的在右边并保持原排序
- C++链表划分左边小中间等右边大 时间复杂度O(n) 空间复杂度O(1)
- 在数组中 找左边都比其小右边都比其大的元素
- 每日一题(61) - 找出左边比它小,右边比它大的数
- 编写一个算法将顺序表A分成两部分,大于0 的在A的左边,小于0的在A的右边
- 仅用O(1)的空间,将整数数组按奇偶数分成2部分,数组左边是奇数、右边是偶数
- 将硬币分成正面朝上个数相等的两堆
- 将一个数组分成和尽可能相等的两份
- 微软100题(93)找出数组中比左边的大比右边的小的元素
- uva10168 将一个数分成四个质数和的形式
- Android Studio3.0新特性及安装详解
- 5-3 多级派生类的构造函数
- linux封装rm -rf指令,防止误删
- 两个正整数的最大公约数和最小公倍数
- 工厂模式
- 将单向链表按某值划分成左边小、中间相等、右边大的形式
- 内核模块编译:Shared Makefile 运行机理
- 微信公众平台开发
- 分享一个硬件SPI读取TFT触摸屏程序
- mySql数据库出问题,整理一下mySql的安装与配置
- mybatis中的延迟加载
- hook read_chk 导致dex2oat进程 abort
- Spring fastjson format 无效
- POI解析文档内容(txt,doc,docx,xls,xlsx,ppt,pdf)