Java与算法(8)

来源:互联网 发布:mac spaces 编辑:程序博客网 时间:2024/05/21 16:58

Java与算法(8)

1.按照左右半区的方式重新组合单链表

链表长度为N,N为偶数,前N/2个节点为左半区,后N/2个节点为右半区

N为奇数,前N/2个节点为左半区,后N/2+1为右半区

public class MergeLR {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 void relocate(Node head) {Node mid = head;Node right = head.next;while (right.next!=null && right.next.next !=null) {mid = mid.next;right = right.next.next;}right= mid.next;mid.next = null;merge(head, right);}public void merge(Node left,Node right) {Node next = null;while (left.next!=null) {next = right.next;right.next  = left.next;left.next = right;left = right.next;right = next;}left.next = right;}public static void main(String[] args) {Node node1 = new Node(1);node1.next = new Node(2);node1.next.next = new Node(3);node1.next.next.next = new Node(4);node1.next.next.next.next = new Node(5);node1.next.next.next.next.next = new Node(6);MergeLR lr = new MergeLR();lr.relocate(node1);lr.printLink(node1);}}

2.合并两个有序单链表

public class MergeNode {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 merge(Node head1 ,Node head2) {Node head = head1.data<head2.data?head1:head2;Node cur1 = head == head1?head1:head2;Node cur2 = head==head1?head2:head1;Node pre = null;Node next = null;while (cur1.next!=null && cur2.next!=null) {if (cur1.data<=cur2.data) {pre = cur1;cur1 = cur1.next;} else {next = cur2.next;pre.next = cur2;cur2.next = cur1;pre = cur2;cur2 = next;}}pre.next = cur1==null?cur2:cur1;return head;}public static void main(String[] args) {Node node1 = new Node(1);node1.next = new Node(3);node1.next.next = new Node(7);node1.next.next.next = new Node(15);Node node2 = new Node(2);node2.next = new Node(3);MergeNode mergeNode = new MergeNode();Node node = mergeNode.merge(node1, node2);mergeNode.printLink(node);}}

3.给出一个节点,但不给定头节点来删除给定节点

public class DeleteNode {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 void delete(Node node) {Node next = node.next;if (next==null) {throw new RuntimeException("can not delete");}node.data = next.data;node.next = next.next;}public static void main(String[] args) {Node node1 = new Node(1);node1.next = new Node(9);node1.next.next = new Node(3);node1.next.next.next = new Node(15);node1.next.next.next.next = new Node(4);node1.next.next.next.next.next = new Node(2);node1.next.next.next.next.next.next = new Node(0);DeleteNode deleteNode = new DeleteNode();deleteNode.printLink(node1);deleteNode.delete(node1.next.next);System.out.println("---");deleteNode.printLink(node1);}}