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