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);}}
原创粉丝点击