从尾到头打印链表

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

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

自己的思路
首先去建立这个链表,再将链表入栈,再出栈,即完成逆序打印链表。最开始没有考虑清楚,这个链表使用了结构体,因此我的栈则不能是存放int类型,那样会很麻烦,而是直接将链表的每个struct压栈,打印的时候只需要求出每个struct对应的val值即可。哎,还是太naive了,题目的考察目的是让你去逆序输出这个链表,而不需要自己去建立这个链表,无形中给自己增加了苦难,而且判断条件容易写错,造成数组越界的错误,考试就没这个时间去调试了。其次,题目要求返回的是一个vector,话说你的vector呢,会a才怪。

class Solution {
public:
    vector<int> printListFromTailToHead(ListNode* head) {
        std::stack<ListNode*> stk; //开始用stack<int> stk,一直报类型不匹配,别人head里面是一个struct
        int temp;
        while(cin >>temp){ //多余的考虑
            head->val = temp;
            stk.push(head);
            head = head->next; //堆栈溢出
        }
        while(!stk.empty()){
            cout << stk.top()->val << endl;
            stk.pop();
        }
    }
};

通过修改后的代码

class Solution {
public:
    vector<int> printListFromTailToHead(ListNode* head) {
        std::stack<ListNode*> stk;
        ListNode* node = head;
        while(node != nullptr){
            stk.push(node);
            node = node->next;
        }
        
        vector<int> result; //通过入栈,再出栈到vector中,就完成了逆序
        while(!stk.empty()){
            result.push_back(stk.top()->val);
            stk.pop();
        }
        return result;
    }
};

大佬的思路
递归进行倒序打印,即想打印第一个就需要打印第二个,以此类推直到最后一个数据先打印出来,再返回去打印之前的数据(感觉优秀的代码都是用的递归,无奈,自己不熟啊。)。采用递归注意出口条件:该节点和下一个节点是否为空。
在这里插入图片描述

class Solution {
public:
    vector<int> printListFromTailToHead(ListNode* head) {
    	vector<int> result;
        ListNode* p=head; //每次递归时,它都指向p->next
        if(p!=NULL){
            if(p->next!=NULL){ //注意递归的出口条件,这也是递归的关键点
                printListFromTailToHead(p->next);
            }
            result.push_back(p->val); //若p->next为空,说明是链表尾了
        }
        return result;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值