首页 > 其他分享 >剑指Offer面试题6:从尾到头打印链表

剑指Offer面试题6:从尾到头打印链表

时间:2023-09-18 17:35:47浏览次数:38  
标签:面试题 遍历 ListNode val Offer ArrayList 链表 listNode

一、题目

输入一个链表的头节点,按链表从尾到头的顺序返回每个节点的值(用数组返回)

如输入{1,2,3}的链表如下图:

剑指Offer面试题6:从尾到头打印链表_Stack

返回一个数组为[3,2,1]

二、题解

看到这题很多人第一反应是从头到尾输出会比较简单,于是我们很自然想到把链表中的节点指针反过来,改变链表结构就可以从头到尾输出了。但该方法会改变原来链表的结构。

是否允许在打印链表的时候修改链表结构?在面试的时候我们需要问清楚面试官的需求。

一般来说,打印是一个只读的操作,而不希望打印时修改内容,现假设面试官要求我们不能修改链表的结构。

2.1 利用Stack栈实现

解决这个问题肯定要遍历链表。遍历的顺序是从头到尾,可输出的顺序确实从尾到头。也就是说第一个遍历的最后一个输出,最后一个遍历的第一个输出。

这就是典型的”后进先出“,于是我们想到栈这种数据结构。

每经过一个节点的时候,把这个节点的值放入栈中,等到遍历完链之后再从栈顶开始逐个输出节点的值。

代码如下:

import java.util.*;
/**
*    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> list = new ArrayList<>();
        ArrayList<Integer> list = new ArrayList<>();
        Stack<Integer> stack = new Stack<>();
        //ListNode node = listNode;
        while(listNode != null){
            stack.push(listNode.val);
            listNode = listNode.next;
        }
        while(!stack.empty()){
            list.add(stack.pop());
        }
        return list;
    }
}

2.2 利用ArrayList实现

ArrayList本身也可以实现类似栈的功能,list.add(0, xxx)即可插入头部

这样的话代码就非常简洁,只需遍历链表,每个节点的值从头插入数组即可

public class Solution {
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        ArrayList<Integer> res = new ArrayList<Integer>();
        while(listNode != null){
            res.add(0,listNode.val);
            listNode = listNode.next;
        }
        return res;
    }
}

标签:面试题,遍历,ListNode,val,Offer,ArrayList,链表,listNode
From: https://blog.51cto.com/u_16244372/7512325

相关文章

  • java必背面试题
    JAVA必背面试题和项目面试通关要点一 数据库 1.常问数据库查询、修改(SQL查询包含筛选查询、聚合查询和链接查询和优化问题,手写SQL语句,例如四个球队比赛,用SQL显示所有比赛组合;举例2:选择重复项,然后去掉重复项;) 数据库里的密码如何加密(md5);(1)数据库的密码加密:单向加密,insert into......
  • 剑指Offer面试题5:替换空格
    一、题目请实现一个函数,把字符串中的每个空格替换成“%20”。例如:输入“Wearehappy.",则输出”We%20are%20happy."。二、解析2.1解法一申请一个临时数组,然后再遍历这个字符串的每个字符,如果不是空格就把遍历的字符添加到临时数组中,如果是空格就添加3个符'%','2','0'分别到临时数组......
  • [剑指offer] 队列&栈篇
    JZ9 用两个栈实现队列1/*模拟入队*/2publicclassJZ9_13{4publicstaticStack<Integer>stack1=newStack<Integer>();5publicstaticStack<Integer>stack2=newStack<Integer>();67publicstaticvoidpush(intnod......
  • 2023 JavaScript想进 BAT 的必须要面对的面试题
    2023JavaScript面试题以及答案在本文中,您将学习面试中最常见的JavaScript面试问题和答案。在继续学习JavaScript面试问题和答案之前,我们首先学习完整的JavaScript教程。JavaScript(JS)是使用最广泛的轻量级脚本和编译编程语言,具有一流的功能,由BrendenEich于1995年开发。众所周......
  • 2023最全面试知识库,1000+常见android面试题,助你备战金九银十
    前言亲爱的面试者朋友们,新一轮金九银十又来了,相信很多人正准备应对新的工作机会和面试挑战。无论你是应届生还是有工作经验的朋友,在面试这个环节都将是你证明自己和获得机会的重要关口。面试是一个复杂的过程,既考察你的专业能力,也考察你的个人素质和应变能力。如何准备面试,掌握面试......
  • 关于pta上6-2 两个有序链表序列的合并
    这是在dev上的源代码,C语言#include<stdio.h>#include<stdlib.h>typedefintElementType;typedefstructNode*PtrToNode;structNode{ElementTypeData;PtrToNodeNext;};typedefPtrToNodeList;ListRead();/*细节在此不表*/voidPrint(List......
  • [剑指offer] 回溯篇
    JZ12矩阵中的路径1/*DFS*/2publicclassJZ12_13{4publicstaticboolean[][]vis;5publicstaticint[]dx=newint[]{-1,1,0,0};6publicstaticint[]dy=newint[]{0,0,-1,1};78publicstaticbooleanhasPath(char[][]......
  • JVM--2021面试题系列教程(附答案解析)
    JVM--2021面试题系列教程(附答案解析)--大白话解读--JavaPub版本前言序言再高大上的框架,也需要扎实的基础才能玩转,高频面试问题更是基础中的高频实战要点。适合阅读人群Java学习者和爱好者,有一定工作经验的技术人,准面试官等。阅读建议本教程是系列教程,包含Java基础,JVM,容......
  • Java面试题和一些经典问题
    Java面试题和一些经典问题整数扩展类浮点数扩展System.out.println(i);System.out.println(i2);System.out.println(i3);System.out.println("===================================");//==================================================//浮点数扩展?银行业务怎么......
  • [剑指offer] 模拟篇
    JZ29 顺时针打印矩阵1/*模拟*/2publicclassJZ29_13{4publicstaticArrayList<Integer>printMatrix(int[][]matrix)5{6ArrayList<Integer>res=newArrayList<>();7intleft=0,right=matrix[0].length-......