[剑指offer]3_逆序打印链表

原创
2020/12/17 09:00
阅读数 174
点击蓝色 程序员的时光  ”关注我 , 标注 星标 ”,及时阅读最新技术文章

从今天开始要和大家分享打卡面试必刷算法题——剑指offer,希望能和大家一起进步!

1,题目描述

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

2,解题思路

方法一:采用栈。先进后出,可以实现顺序反转;
方法二:采用ArrayList的反转方法reverse(),实现顺序反转;
方法三:利用ArrayList的插入方法,每次都往index为0的位置插入,那么新插入的元素就会把后插入的元素默认往后移;
方法四:非递归。用一个while循环来做;
方法五:递归。

3,程序代码

/**
** 方法一
** 栈实现
*/

public static ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
    ArrayList<Integer> list=new ArrayList<>();
    Stack<Integer> stack=new Stack<Integer>();
    //入栈
    while(listNode!=null){
        stack.add(listNode.val);
        listNode=listNode.next;
    }
    //取栈顶元素
    while(!stack.isEmpty()){
        list.add(stack.pop());
    }
    return list;
}

/**
** 方法二
** reverse逆序输出
*/

public static void printListFromTailToHead3() {
    ArrayList<Integer> list=new ArrayList<>();
    list.add(1);
    list.add(2);
    list.add(3);
    list.add(4);
    list.add(5);
    //反转方法
    Collections.reverse(list);
    System.out.println(list);
}

/**
** 方法三
** 利用ArrayList的插入方法,每次都往index为0的位置插入,那么新插入的元素就会把后插入的元素默认往后移
*/

    public static void printListFromTailToHead4() {
        ArrayList<Integer> list=new ArrayList<>();
        list.add(0,1);
        list.add(0,2);
        list.add(0,3);
        list.add(0,4);
        list.add(0,5);
        System.out.println(list);
    }

链表结点LinkNode如下;

package JianZhiOffer;

/**
 * @author 公众号:程序员的时光
 * @create 2020-09-22 15:03
 * @description
 */

public class ListNode {
    //链表结点的数据域
    public Integer val;
    //链表结点的指针域
    public ListNode next;

    //构造方法
    public ListNode(int val, ListNode next) {
        super();
        this.val = val;
        this.next = next;
    }
}

采用递归和非递归两种方式都能实现

package JianZhiOffer;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Stack;

/**
 * @author 公众号:程序员的时光
 * @create 2020-09-22 14:50
 * @description
 */

public class No3_PrintList {
    //递归输出
    public static ArrayList<Integer> printListFromTailToHead1(ListNode listNode) {
        ArrayList<Integer> list=new ArrayList<>();
        if(listNode!=null){
            list=printListFromTailToHead1(listNode.next);
            list.add(listNode.val);
        }
        return list;
    }
    //非递归输出
    public static ArrayList<Integer> printListFromTailToHead2(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) {
        ArrayList list=new ArrayList();
        ListNode head=new ListNode(0,null);
        ListNode PNode=head;

        for(int i=1; i<10; i++){
            ListNode node=new ListNode(i,null);
            PNode.next=node;
            PNode=node;
        }
        System.out.println(printListFromTailToHead1(head));
        System.out.println(printListFromTailToHead2(head));
    }
}

结果:

image-20201110210123518

4,闲聊

源代码已经上传至码云:

[]: https://gitee.com/Huke-123/offer66_interview_questions/

欢迎大家关注我的B站账号:https://space.bilibili.com/92317221,后续我会采用视频的方式简单讲解;


好了,今天就先分享到这里了,下期继续给大家带来剑指offer面试题后续内容!更多干货、优质文章,欢迎关注我的原创技术公众号~


本文分享自微信公众号 - 程序员的时光(gh_9211ec727426)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

展开阅读全文
加载中

作者的其它热门文章

打赏
0
0 收藏
分享
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部