美文网首页
《剑指offer》(三)-从头到尾打印链表(java)

《剑指offer》(三)-从头到尾打印链表(java)

作者: 鼠小倩 | 来源:发表于2019-11-06 13:54 被阅读0次

从头到尾打印链表

题目描述

输入一个链表,按链表从尾到头的顺序返回一个ArrayList。

代码格式要求

import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        
    }
}

解题一

1.思路:调用一个函数
ArrayList的add(index,value),可以指定index位置插入value,所以在遍历ListNode的同时,将值插入到index=0的位置上,这样就可以反向输出。
2.代码

package jianzhi_offer;
import java.util.ArrayList;
public class Solution3_1 {
    /**
     * 输入一个链表,按链表从尾到头的顺序返回一个ArrayList。
     * @param listNode
        * 非递归的方法
     */
    public static ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        ArrayList<Integer> list = new ArrayList<>();
               ListNode tmp = listNode;
               while(tmp!=null){
                   list.add(0,tmp.val);
                   tmp = tmp.next;
               }
               return list;
   }
//测试
    public static void main(String[] args) {
        ListNode listNode1 = new ListNode(1);
        ListNode listNode2 = new ListNode(2);
        ListNode listNode3 = new ListNode(3);
        ListNode listNode4 = new ListNode(4);
        ListNode listNode5 = new ListNode(5);
        ListNode listNode6 = new ListNode(6);
        listNode1.next = listNode2;
        listNode2.next = listNode3;
        listNode3.next = listNode4;
        listNode4.next = listNode5;
        listNode5.next = listNode6;
        ArrayList <Integer> arr = printListFromTailToHead(listNode1);
        System.out.println(arr);
    } 
}
public class ListNode {
    int val;
    ListNode next = null;
    ListNode(int val) {
    this.val = val;
    }
}

3.复杂度
时间复杂度:O(n)
空间复杂度:O(n)

解题二

1.思路
运用递归实现
2.代码

import java.util.ArrayList;
public class Solution3_2 {
    ArrayList<Integer> list = new ArrayList();
        public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
            if(listNode!=null){
                printListFromTailToHead(listNode.next);
                list.add(listNode.val);
             }
             return list;
        }
}

3.复杂度
时间复杂度:O(n)
空间复杂度:O(n)

解题三(*)

1.思路
根据题意要求从尾到头的顺序,ListNode是链表,只能从头遍历到尾,所以考虑用栈的思想。
2.代码

package jianzhi_offer;
import java.util.ArrayList;
import java.util.Stack;

public class Solution3_3 {
//运用栈的思想
public static ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        ArrayList<Integer> list = new ArrayList<>();
        Stack<Integer> stack = new Stack<>();
        while (listNode != null) {
             stack.push(listNode.val);
             listNode = listNode.next;
         }
        while (!stack.empty()) {
              list.add(stack.pop());
        }
        return list;
    }
}

相关文章

网友评论

      本文标题:《剑指offer》(三)-从头到尾打印链表(java)

      本文链接:https://www.haomeiwen.com/subject/wuhupctx.html