【剑指offer】从尾到头打印链表

我的思路:先翻转链表,再打印。

网上思路:利用栈的后进先出性质;或者用递归,本质也是栈。

我的代码:

#include <vector>
using namespace std;

struct ListNode {
       int val;
       struct ListNode *next;
       ListNode(int x) :
             val(x), next(NULL) {}
};

class Solution {
public:
    vector<int> printListFromTailToHead(struct ListNode* head) {
        if(NULL == head) return vector<int>();
        vector<int> ans;
        //先翻转
        ListNode * rh = head, * p = head->next;
        rh->next = NULL;
        while(NULL != p)
        {
            ListNode * p2 = p->next;
            p->next = rh;
            rh = p;
            p = p2;
        }
        //再打印
        p = rh;
        while(NULL != p)
        {
            ans.push_back(p->val);
            p = p->next;
        }

        return ans;
    }
};

网上代码:

方法一:借助堆栈的“后进先出”实现

import java.util.ArrayList;
import java.util.Stack;
public class Solution {
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        Stack<Integer> stack=new Stack<Integer>();
        while(listNode!=null){
            stack.push(listNode.val);
            listNode=listNode.next;
        }

        ArrayList<Integer> list=new ArrayList<Integer>();
        while(!stack.isEmpty()){
            list.add(stack.pop());
        }
        return list;
    }
}

方法二:借助递归实现(递归的本质还是使用了堆栈结构)
import java.util.ArrayList;
import java.util.Stack;
public class Solution {
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        ArrayList<Integer> list=new ArrayList<Integer>();

        ListNode pNode=listNode;
        if(pNode!=null){
            if(pNode.next!=null){
                list=printListFromTailToHead(pNode.next);
            }
            list.add(pNode.val);
        }

        return list;
    }
}
时间: 2024-10-08 19:35:01

【剑指offer】从尾到头打印链表的相关文章

剑指offer | 从尾到头打印链表

题目描述: “输入一个链表,从尾到头打印链表每个节点的值.” 这是我做的<剑指offer>系列的第一题,好的开头就是成功的一半.然而,我提交了一次,WA!再提交,WA!Com'on! 看来我的开端并不顺利.不过我要的可不是成功的一半,这样的开端怎么能阻挡我AC之路!仔细看了一遍题目要求,看了提交格式.再提交! Finally,AC! 代码如下: 1 /** 2 * struct ListNode { 3 * int val; 4 * struct ListNode *next; 5 * Lis

剑指offer——从尾到头打印链表节点的值

输入一个链表,从尾到头打印链表每个节点的值. 输入描述:输入为链表的表头 输出描述:输出为需要打印的“新链表”的表头 一.问题分析 初拿到这个题目时,这应该是考察单向链表这一数据结构.单向链表的遍历总是从头指针逐项遍历各个节点,现在要求从尾到头打印节点的值,我们可以在遍历时把各节点压入栈内,最后出栈打印各个节点值,即可达到要求. 实现之前,我们先来看看如何创建一个链表. 1,链表节点的数据结构定义 1 struct ListNode { 2 int val; 3 struct ListNode

剑指offer —— 从尾到头打印链表

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

剑指offer从尾到头打印链表python

题目描述 输入一个链表,按链表从尾到头的顺序返回一个ArrayList. 题目链接 思路 遍历链表,把结构保存在list里面,然后把list逆序输出 代码 1 # -*- coding:utf-8 -*- 2 # class ListNode: 3 # def __init__(self, x): 4 # self.val = x 5 # self.next = None 6 7 class Solution: 8 # 返回从尾部到头部的列表值序列,例如[1,2,3] 9 def printLi

剑指Offer-3.从尾到头打印链表(C++/Java)

题目: 输入一个链表,按链表从尾到头的顺序返回一个ArrayList. 分析: 很简单的一道题,其实也就是从尾到头打印链表,题目要求返回ArrayList,其实也就是一个数组. 可以将链表中的元素全部压入栈中,再从栈中依次弹出元素,就可以得到倒序的链表输出. 当然也可以直接将链表中元素传入数组中,最后再翻转数组即可. 程序: C++ //use stack class Solution { public: vector<int> printListFromTailToHead(ListNode

【剑指offer】逆序打印链表

用栈能很easy的解决,直接贴代码: struct ListNode{ int m_nValue; ListNode *m_pNext; }; void PrintListRevers(ListNode* pHead) { stack<ListNode*> nodes; ListNode* pNode = pHead; while(pNode != NULL) { nodes.push(pNode); pNode = pNode->m_pNext; } while(!nodes.empt

【剑指offer】Q5:从尾到头打印链表

可以练习下链表的逆置. def PrintListReversingly(head): if head == None: return if head: PrintListReversingly(head.next) print head.val def reverse(head): if head == None or head.next == None: return head psuhead = ListNode(-1) while head: nexthead = head.next h

LeetCode | 面试题06. 从尾到头打印链表【剑指Offer】【Python】

LeetCode 面试题06. 从尾到头打印链表[剑指Offer][Easy][Python][链表] 问题 力扣 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回). 示例 1: 输入:head = [1,3,2] 输出:[2,3,1] 限制: 0 <= 链表长度 <= 10000 思路 解法一 reverse函数 时间复杂度: O(n),n为 head 链表长度. 空间复杂度: O(n),n为 head 链表长度. Python3代码 # Definition for si

《剑指Offer》题目——从尾到头打印链表

题目描述:输入一个链表,从尾到头打印链表每个节点的值. 题目分析:用栈:Java用Stack不如用Deque接口,原因可以见链接:http://stackoverflow.com/questions/12524826/why-should-i-use-deque-over-stack public class ReverseList { class ListNode{ int val; ListNode next = null; ListNode(int val){ this.val = val

《剑指offer》— JavaScript(3)从尾到头打印链表

从尾到头打印链表 题目描述 输入一个链表,从尾到头打印链表每个节点的值. 实现代码 /*function ListNode(x){ this.val = x; this.next = null; }*/ function printListFromTailToHead(head) { var res=[]; while(head){ res.unshift(head.val); head=head.next; } return res; } 相关知识 创建一个链表,并实现插入,删除,添加的方法