packageredbook;importjava.util.Scanner;/*** 题目:
以字符串形式构成单链表,将所有奇数位置上的元素一起前置到所有偶数位置上的元素的前面,不能申请额外空间,在o(n)时间内完成。
例如:
输入:1->2->3->4->5->6->7->8
输出:1->3->5->7->2->4->6->8->NULL
思路:
多找几个指针,动态链接。*/
public classMain3 {public static voidmain(String[] args) {
Scanner in=newScanner(System.in);while(in.hasNext()){//输入字符串
String line=in.nextLine();//切割字符串
String[] arr=line.split("->");//调用交换的方法
changeMethod(arr);
}
in.close();
}public static voidchangeMethod(String[] arr){//创建单链表
listNode oddPointer=null;
listNode pointer=null;
oddPointer=new listNode(Integer.parseInt(arr[0]),null);
pointer=oddPointer;for(int i=1;i
pointer.next=new listNode(Integer.parseInt(arr[i]),null);
pointer=pointer.next;
}
}//换位置
boolean flag=true;
listNode oddHeadPointer=oddPointer; //保存奇数位置头指针
listNode evenPointer=null;//偶数位置指针
listNode evenHeadPointer=null;//偶数位置头指针
if(oddHeadPointer.next!=null){
evenHeadPointer=evenPointer=oddHeadPointer.next;//初始化偶数位置头指针
pointer=evenPointer.next;//创建滑动的指针
while(pointer!=null){if(flag==true){ //创建奇数位置数字的链表
oddPointer.next=pointer;
pointer=pointer.next;
oddPointer=oddPointer.next;
flag=false;
}else{ //创建偶数位置数字的链表
evenPointer.next=pointer;
pointer=pointer.next;
evenPointer=evenPointer.next;
flag=true;
}
}
evenPointer.next=null;
oddPointer.next=evenHeadPointer; //把偶数位置的链表接在奇数位置链表的后面
}//打印输出换好位置的链表
while(oddHeadPointer!=null){
System.out.print(oddHeadPointer.val+"->");
oddHeadPointer=oddHeadPointer.next;
}
System.out.print("NULL");
System.out.println();
}//链表节点类
public static classlistNode{intval;
listNode next;
listNode(intval,listNode node){this.val =val;this.next =node;
}
}
}