某书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;
        }
    }

}
View Code

---------------------------------------------

参考链接:

http://blog.csdn.net/yingzizizizizizzz/article/details/75452291

posted @ 2017-10-24 22:04  AI菌  阅读(583)  评论(0编辑  收藏  举报