Java与算法(6)
来源:互联网 发布:软件评测师报考 编辑:程序博客网 时间:2024/06/06 00:30
Java与算法(6)
题目:
将单链表按某值划分为左边小,中间相等,右边大的形式。
如:
9-0-4-5-1,按3来划分
结果就是1-0-4-9-5
对部分内部节点顺序不做要求
public class DivideLink {public static class Node {int data;Node next;public Node(int data) {this.data = data;}}public Node divide(Node head,int p) {int i=0;Node node = head;while (node!=null) {i++;node=node.next;}Node[] nodes = new Node[i];node=head;for(int j=0;j<nodes.length;j++) {nodes[j] = node;node=node.next;}sort(nodes, p);for(int j=1;j<nodes.length;j++) {nodes[j-1].next = nodes[j];}nodes[i-1].next = null;return nodes[0];}public void printLink(Node head) {while (head!=null) {System.out.println(head.data+" ");head=head.next;}System.out.println();}public void sort(Node[] nodes,int p) {int index = 0;int big = nodes.length;int small = -1;while (index!=big) {if (nodes[index].data<p) {swap(nodes, ++small, index++);}else if (nodes[index].data == p) {index++;} else {swap(nodes, --big, index);}}}public void swap(Node[] nodes ,int a,int b) {Node tNode = nodes[a];nodes[a] = nodes[b];nodes[b] = tNode;}public static void main(String[] args) {Node node1 = new Node(9);node1.next = new Node(0);node1.next.next = new Node(4);node1.next.next.next = new Node(5);node1.next.next.next.next = new Node(1);DivideLink divideLink = new DivideLink();Node node = divideLink.divide(node1, 3);divideLink.printLink(node);}}
题目:
两个链表相加生成新链表
如:
9-3-7和6-3
生成1-0-0-0
public class AddLink {public static class Node {int data;Node next;public Node(int data) {this.data = data;}}public void printLink(Node head) {while (head!=null) {System.out.println(head.data+" ");head=head.next;}System.out.println();}public Node add(Node node1,Node node2) {Stack<Integer> s1 = new Stack<>();Stack<Integer> s2 = new Stack<>();while (node1!=null) {s1.push(node1.data);node1=node1.next;}while (node2!=null) {s2.push(node2.data);node2=node2.next;}int ca = 0;int n1 = 0;int n2 = 0;Node node = null;Node pre = null;int n=0;while (!s1.isEmpty() || !s2.isEmpty()) {n1 = s1.isEmpty()?0:s1.pop();n2 = s2.isEmpty()?0:s2.pop();n=n1+n2+ca;pre = node;node = new Node(n%10);node.next = pre;ca = n/10;}if (ca == 1) {pre = node;node = new Node(1);node.next=pre;}return node;}public static void main(String[] args) {Node node1 = new Node(1);node1.next = new Node(3);node1.next.next = new Node(7);Node node2 = new Node(2);node2.next = new Node(3);AddLink dAddLink = new AddLink();Node node = dAddLink.add(node1, node2);dAddLink.printLink(node);}}
题目:
将单链表的每k个节点逆序
如:
1-2-3-4-5-6-7-8,k=3
结果:
3-2-1-6-5-4-7-8
public class ReverseKNode {public static class Node {int data;Node next;public Node(int data) {this.data = data;}}public void printLink(Node head) {while (head!=null) {System.out.println(head.data+" ");head=head.next;}System.out.println();}public Node reverse(Node head,int k) {Node cur = head;Node newhead = head;Node pre = null;Node next = null;Stack<Node> stack = new Stack<>();while (cur!=null) {next = cur.next;stack.push(cur);if (stack.size()==k) {pre = resignl(stack, pre, next);newhead = newhead == head?cur:newhead;}cur = next;}return newhead;}public Node resignl(Stack<Node> stack,Node left,Node right) {Node cur = stack.pop();if (left!=null) {left.next = cur;}Node next = null;while (!stack.isEmpty()) {next = stack.pop();cur.next = next;cur = next;}cur.next = right;return cur;}public static void main(String[] args) {Node node1 = new Node(1);node1.next = new Node(3);node1.next.next = new Node(5);node1.next.next.next = new Node(7);node1.next.next.next.next = new Node(9);node1.next.next.next.next.next = new Node(11);node1.next.next.next.next.next.next = new Node(13);node1.next.next.next.next.next.next.next = new Node(15);ReverseKNode kNode = new ReverseKNode();kNode.printLink(node1);Node node = kNode.reverse(node1, 3);System.out.println("------");kNode.printLink(node);}}
阅读全文
0 0
- Java与算法(6)
- Java与算法(1)
- Java与算法(2)
- Java与算法(3)
- Java与算法(4)
- Java与算法(5)
- Java与算法(7)
- Java与算法(8)
- Java与算法(9)
- Java与算法(10)
- Java与算法(11)
- Java与算法(12)
- Java与算法(13)
- 数据结构与算法(6)---Java语言实现:冒泡排序
- FIFO与LRU 算法实现(java)
- 数据结构与算法分析(JAVA版)
- java算法心得与技巧(一)
- java数据结构与算法(一)
- WebService CXF调试常见报错及解决方案
- C++模板详细整理
- Android面试
- itk中的毛刺去除算法
- 2017中国VR体验创新大会报名时间
- Java与算法(6)
- PowerManager.WakeLock
- Git系统学习记录(三) --github远程仓库
- 简单十招提高jQuery执行效率
- 图标分享网站
- Android Studio 编译报错“java.lang.OutOfMemoryError: GC overhead limit exceeded”
- 关于laravel框架引入公共目录的方法
- C++ 读取包含空白字符的字符串
- Glaces环境安装教程