新手练手感--leetCode之打印反转链表

输入一个链表,从尾到头打印链表每个节点的值。

第一种解法:

(1)值放在一个数组中

(2)反转数组

第二种解法:

(1)反转链表

(2)遍历一遍得到值

 

solution 1:

/**
*    public class ListNode {
*        int val;
*        ListNode next = null;
*
*        ListNode(int val) {
*            this.val = val;
*        }
*    }
*
*/
import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        ArrayList<Integer> result = new ArrayList<Integer>();
        //空链表
        if(listNode == null) {
            return result;
        }
        //取值
        while(listNode != null) {
            result.add(listNode.val);
            listNode = listNode.next;
        }
        
        //反转
        for(int i = 0; i < result.size()/2; i++) {
            int temp = result.get(i);
            result.set(i, result.get(result.size() - 1 - i));
            result.set(result.size() - 1 - i, temp);
        }
        
        return result;
    }
}

 

solution 2:

/**
*    public class ListNode {
*        int val;
*        ListNode next = null;
*
*        ListNode(int val) {
*            this.val = val;
*        }
*    }
*
*/
import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        ArrayList<Integer> result = new ArrayList<Integer>();
        if(listNode == null) {
            return result;
        }
        //定义循环到的节点的上一个节点和下一个节点
        ListNode pre = null;
        ListNode next = null;
        //第一步,反转链表
        while(listNode != null) {
            //当前节点的下一节点
            next = listNode.next;
            //当前节点下一个指向前一个节点
            listNode.next = pre;
            //前一个节点移动当前节点
            pre = listNode;
            //当前节点向后移
            listNode = next;
        }
        
        //pre 是反转后的头结点
        while(pre != null) {
            result.add(pre.val);
            pre = pre.next;
        }
        return result;
    }
}

 

posted @ 2017-06-20 23:44  jiguojing  阅读(373)  评论(0)    收藏  举报