牛客网《剑指Offer》3.从尾到头打印链表

题目描述

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

单链表的数据结构如下:

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

解题思路

由于是从尾到头进行打印,想到LIFO,所以使用栈的结构。

先将链表中的每个节点值压栈

再将栈中的每个值依次弹出,存放入需要返回的vector里。

代码实现

 vector<int> printListFromTailToHead(ListNode* head) {
        vector<int> vec;
        stack<int> stk;
        ListNode* p=head;
        while(p!=NULL){
            stk.push(p->val);
            p=p->next;
        }
        while(!stk.empty()){
            vec.push_back(stk.top());
            stk.pop();
        }
        return vec;
    }

算法改进

由于是与栈有关的操作,因此能够使用递归操作。

vector<int> vec;
void printListFromTailToHead(ListNode* head) {
       if(head!=NULL){
            if(head->next!=NULL){
                printListFromTailToHead(head->next);
            }
            vec.push_back(head->val);
        }
    }

单链表的其他操作:增加、删除节点操作。

猜你喜欢

转载自blog.csdn.net/eriHanami/article/details/82252399