某书2018提前批笔试题之单链表奇偶位置元素互换
一、题目
以字符串形式构成单链表,将所有奇数位置上的元素一起前置到所有偶数位置上的元素,不能申请额外空间,在o(n)时间内完成。
二、思路
多找几个指针,动态链接,详见代码注释。
三、代码
package redbook; import java.util.Scanner; /** * 题目: 以字符串形式构成单链表,将所有奇数位置上的元素一起前置到所有偶数位置上的元素的前面,不能申请额外空间,在o(n)时间内完成。 例如: 输入:1->2->3->4->5->6->7->8 输出:1->3->5->7->2->4->6->8->NULL 思路: 多找几个指针,动态链接。 */ public class Main3 { public static void main(String[] args) { Scanner in=new Scanner(System.in); while (in.hasNext()){ //输入字符串 String line=in.nextLine(); //切割字符串 String[] arr=line.split("->"); //调用交换的方法 changeMethod(arr); } in.close(); } public static void changeMethod(String[] arr){ //创建单链表 listNode oddPointer=null; listNode pointer=null; oddPointer=new listNode(Integer.parseInt(arr[0]),null); pointer=oddPointer; for(int i=1;i<arr.length;i++){ if(!arr[i].equals("NULL")){ 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 class listNode{ int val; listNode next; listNode(int val,listNode node){ this.val = val; this.next = node; } } }
---------------------------------------------
参考链接:
http://blog.csdn.net/yingzizizizizizzz/article/details/75452291