欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

从头到尾打印链表

程序员文章站 2022-06-05 19:46:17
...

题目描述

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

思路1:利用栈“先进后出”的思想,将链表倒叙返回。从头到尾将链表遍历并入栈,然后,出栈放到数组中。

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

思路2:先将链表的数值存放到数组中,再将数组倒置。

/**
*  struct ListNode {
*        int val;
*        struct ListNode *next;
*        ListNode(int x) :
*              val(x), next(NULL) {
*        }
*  };
*/
class Solution {
public:
    vector<int> printListFromTailToHead(ListNode* head) {
        vector<int> value;
        ListNode *p=NULL;
        p=head;
        while(p!=NULL){
            value.push_back(p->val);//存放到数组中
            p=p->next;
        }
        int temp=0,i=0,j=value.size()-1;
        while(i<j){//将数组倒置
            temp=value[j];
            value[j]=value[i];
            value[i]=temp;
            i++;
            j--;
        }
        return value;
    }
};

思路3:递归。递归虽然程序简单,不要轻易尝试,容易内存溢出。

/**
*  struct ListNode {
*        int val;
*        struct ListNode *next;
*        ListNode(int x) :
*              val(x), next(NULL) {
*        }
*  };
*/
class Solution {
public:
    vector<int> value;
    vector<int> printListFromTailToHead(ListNode* head) {
        ListNode *p=NULL;
        p=head;
        if(p!=NULL){
            if(p->next!=NULL){//递归条件
                printListFromTailToHead(p->next);
            }
            value.push_back(p->val);
        }
        return value;
    }
};