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);
}
}