【3】从尾到头打印链表

原创 2016年08月29日 20:01:27

【3】从尾到头打印链表

  • 时间限制:1秒
  • 空间限制:32768K
    本题知识点: 链表

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

输入描述:
输入为链表的表头
输出描述:
输出为需要打印的“新链表”的表头
牛客网题目链接:点击这里


方法一:用栈

/**
*  struct ListNode {
*        int val;
*        struct ListNode *next;
*        ListNode(int x) :
*              val(x), next(NULL) {
*        }
*  };
*/
class Solution {   
public:
    vector<int> printListFromTailToHead(struct ListNode* head) {
        stack<int> result1;
        vector<int> result;
        if(head==NULL) return result;
        while(head!=NULL)
        {
            result1.push(head->val);
            head=head->next;
        }
        while(!result1.empty())
        {
            result.push_back(result1.top());
            result1.pop();
        }
        return result;
    }
};

方法二:递归

class Solution {   
public:
    vector<int> printListFromTailToHead(struct ListNode* head) {

        vector<int> result;
        if(head==NULL) return result;
        result.insert(result.begin(),head->val);
        if(head->next!=NULL)
        {
            vector<int> temp;
            temp=printListFromTailToHead(head->next);
            result.insert(result.begin(),temp.begin(),temp.end());
        }
        return result;
    }
};

方法三:

更改链表指针,原地逆序

class Solution {   
public:
    vector<int> printListFromTailToHead(struct ListNode* head) {

        vector<int> result;
        if(head==NULL) return result;
        struct ListNode* pre=NULL;
        struct ListNode* p=head;
        while( head->next!=NULL )
        {
            p=p->next;
            head->next=pre;
            pre=head;
            head=p;
        }
        head->next=pre;

        while(head!=NULL)
        {
            result.push_back(head->val);
            head=head->next;
        }

        return result;
    }
};

方法四:递归 深度优先

//写法一:
//其中需要不断的创建容器数组,返回容器数组,销毁递归深处的数组
class Solution {

public:
    vector<int> printListFromTailToHead(struct ListNode* head) {
        vector<int> result;
        if(head==NULL) return result;

        //深度优先遍历
        if(head->next!=NULL)
        {
            result=printListFromTailToHead(head->next);
        }
        result.push_back(head->val);
        return result;
    }
};
写法二:
不需要创建和销毁数组,但是会占用初始空间
class Solution {
    vector<int> result; //一次定义
public:
    vector<int> printListFromTailToHead(struct ListNode* head) {
        if(head==NULL) return result;

        //深度优先遍历
        if(head->next!=NULL)
        {
            printListFromTailToHead(head->next);
        }
        result.push_back(head->val);
        return result;
    }
};

方法五:用insert方法,

代码简洁,复杂度较高

class Solution {
public:
    vector<int> printListFromTailToHead(struct ListNode* head) {
        vector<int> result;
        while(head)
        {
            result.insert(result.begin(),head->val);
            head=head->next;
        }
        return result;
    }
};
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

1511 从尾到头打印链表

  • 2014-10-24 12:12
  • 410B
  • 下载

《剑指offer》---从尾到头打印链表 和 重建二叉树

《剑指offer》—从尾到头打印链表 和 重建二叉树

面试题5: 从尾到头打印链表

一. 题目输入一个链表的头结点,从尾到头反过来打印出每个节点的值.代码请到我的代码库中下载 Point2Offer二. 代码package com;import java.util.Stack;/**...

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

记录来自《剑指offer》的算法题目 链表应该是面试时被提及最频繁的数据结构,它的结构简单,由若干个结点连接成链状结构,其创建、插入结点、删除结点等操作都只需要20行左右的代码就能实现,其代码量比较...
  • lc013
  • lc013
  • 2016-12-09 16:59
  • 93

从尾到头打印链表

使用数据结构stack或者递归 1 使用stack #include #include using namespace std; typedef struct listNode{ int...

从尾到头打印链表(java版)

【题目描述】输入一个链表,从尾到头打印链表每个节点的值。【解题思路1】 //1. 遍历链表,使用一个ArrayList存储各个链表结点。 //2. 将ArrayList关于对称中心,进行翻转。得到...

题目1511:从尾到头打印链表

题目描述: 输入一个链表,从尾到头打印链表每个节点的值。 输入: 每个输入文件仅包含一组测试样例。 每一组测试案例包含多行,每行一个大于0的整数,代表一个链表的节点。第...

从尾到头打印链表值

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

剑指offer-面试题5 从尾到头打印链表

剑指offer-面试题5-1 从尾到头打印链表题目:输入一个链表(的头结点),从尾到头反过来打印出每个结点的值。 【注】:这里实现的链表由于结点是内部类,无法直接传递进入reverse()方法,我决...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)