java">import java . util. ArrayList ;
import java . util. List ;
public class OddEvenLink {
private static class Node {
int value = - 1 ;
Node next = null ;
public Node ( ) {
}
public Node ( int value) {
this . value = value;
}
}
public static void main ( String [ ] args) {
OddEvenLink oddEvenLink = new OddEvenLink ( ) ;
int [ ] oddNodeValues = { 1 , 6 , 10 , 60 } ;
int [ ] evenNodeValues = { 100 , 11 , 5 , 4 } ;
Node oldHeadNode = oddEvenLink. getOldLink ( oddNodeValues, evenNodeValues) ;
Node newHeadNode = oddEvenLink. getNewLink ( oldHeadNode) ;
oddEvenLink. searchNewLink ( newHeadNode) ;
}
public Node getOldLink ( int [ ] oddNodeValues, int [ ] evenNodeValues) {
int i = 0 ;
int j = 0 ;
Node dummyHeadNode = new Node ( ) ;
Node currentNode = dummyHeadNode;
boolean isCurrentOdd = true ;
while ( i < oddNodeValues. length || j < evenNodeValues. length) {
Node node;
if ( isCurrentOdd) {
node = new Node ( oddNodeValues[ i++ ] ) ;
} else {
node = new Node ( evenNodeValues[ j++ ] ) ;
}
currentNode. next = node;
currentNode = node;
isCurrentOdd = ! isCurrentOdd;
}
return dummyHeadNode. next;
}
public Node getNewLink ( Node oldHeadNode) {
List < Node > oddHeadNoeAndEvenHeadNode = getOddLinkAndEvenLink ( oldHeadNode) ;
Node oldOddHeadNode = oddHeadNoeAndEvenHeadNode. get ( 0 ) ;
Node oldEvenHeadNode = oddHeadNoeAndEvenHeadNode. get ( 1 ) ;
Node newEvenHeadNode = getNewEvenLink ( oldEvenHeadNode) ;
return getNewLink ( oldOddHeadNode, newEvenHeadNode) ;
}
public void searchNewLink ( Node newHeadNode) {
Node currentNode = newHeadNode;
while ( currentNode != null ) {
System . out. println ( currentNode. value) ;
currentNode = currentNode. next;
}
}
private Node getNewLink ( Node oldOddHeadNode, Node newEvenHeadNode) {
Node currentOddNode = oldOddHeadNode;
Node currentEvenNode = newEvenHeadNode;
Node dummyNewHeadNode = new Node ( ) ;
Node currentNewNode = dummyNewHeadNode;
while ( currentOddNode != null && currentEvenNode != null ) {
if ( currentOddNode. value <= currentEvenNode. value) {
currentNewNode. next = currentOddNode;
currentOddNode = currentOddNode. next;
} else {
currentNewNode. next = currentEvenNode;
currentEvenNode = currentEvenNode. next;
}
currentNewNode = currentNewNode. next;
}
if ( currentOddNode == null && currentEvenNode == null ) {
return dummyNewHeadNode. next;
}
if ( currentOddNode != null ) {
currentNewNode. next = currentOddNode;
}
if ( currentEvenNode != null ) {
currentNewNode. next = currentEvenNode;
}
return dummyNewHeadNode. next;
}
private Node getNewEvenLink ( Node oldEvenHeadNode) {
Node currentNode = oldEvenHeadNode;
Node currentPreNode = null ;
while ( currentNode != null ) {
Node currentNextNode = currentNode. next;
currentNode. next = currentPreNode;
currentPreNode = currentNode;
currentNode = currentNextNode;
}
return currentPreNode;
}
private List < Node > getOddLinkAndEvenLink ( Node oldHeadNode) {
Node dummyOddHeadNode = new Node ( ) ;
Node currentOddNode = dummyOddHeadNode;
Node dummyEvenHeadNode = new Node ( ) ;
Node currentEvenNode = dummyEvenHeadNode;
Node currentNode = oldHeadNode;
boolean isCurrentOdd = true ;
while ( currentNode != null ) {
if ( isCurrentOdd) {
currentOddNode. next = currentNode;
currentOddNode = currentOddNode. next;
} else {
currentEvenNode. next = currentNode;
currentEvenNode = currentEvenNode. next;
}
currentNode = currentNode. next;
isCurrentOdd = ! isCurrentOdd;
}
currentOddNode. next = null ;
currentEvenNode. next = null ;
List < Node > nodes = new ArrayList < > ( ) ;
nodes. add ( dummyOddHeadNode. next) ;
nodes. add ( dummyEvenHeadNode. next) ;
return nodes;
}
}