逆序链表

public class Main {
    public static void main(String[] args){
        int[] array = {1,2,3,4,5};
        Main main = new Main();
        Node root = main.initLinkList(array);//根据array生成链表
        //遍历链表,看一下顺序
//        while (root != null){
//            System.out.print(root.val + ",");
//            root = root.next;
//        }
//
//        System.out.println();

        Node r = main.reverse(root);//将上一步生成的链表逆序
        //遍历逆序链表,看一下顺序是否倒了过来
        while (r != null){
            System.out.print(r.val + ",");
            r = r.next;
        }
    }
    //链表逆序,头插法
    public Node reverse(Node src){//src是当前需要逆序链表的第一个节点
        Node head = null;//代表逆序部分的第一个节点
        Node current = null;//用来临时存储低当前正要逆序的节点

        while (src != null){
            current = src;//用current来保存src节点,也就是接下来需要逆序的那个节点
            src = current.next;//遍历链表,看一下顺序.next;//将src指向current的下一个,也就是它自己的下一个。也可写成src = src.next
            current.next = head;//将当前需要逆序的节点的下一个指向已经逆序好了的链表的第一个节点。(头插法就是在前面插入新节点)
            head = current;//重新给head设置值,使指向已经逆序部分的第一个,current.next = head这句代码已经将已逆序链表的第一个改变了
        }

        return head;//返回逆序链表的第一个
    }
    /**
     * 根据数组建立链表,尾插法。
     * */
    public Node initLinkList(int[] array){
        //root代表生成链表的第一个(可由第一个遍历整个链表)。
        //在生成链表的时候要在链表的最后添加新节点,也就是在current上操作,但是要返回链表第一个,所以用root来保存第一个用于返回
        Node root = null;
        Node current = null;//代表生成链表时正在处理的节点
        if(array != null && array.length > 0){
            for(int i = 0; i < array.length; i ++){
                Node node = new Node(array[i]);
                if(root != null){//如果不是数组的第一个,处理如下
                    current.next = node;
                    current = node;
                }else{//如果是数组的第一个,将
                    root = current = node;
                }
            }
        }
        return root;
    }
}
//定义为节点,就是链表中的节点。val代表存储的值,next代表下一个
class Node{
    public int val;
    public Node next;
    public Node(int val){
        this.val = val;
    }
}

 

posted @ 2017-08-14 11:50  流浪在寂寞古城  阅读(122)  评论(0编辑  收藏  举报