【一刷《剑指Offer》】面试题 5:从尾到头打印链表

简介: 【一刷《剑指Offer》】面试题 5:从尾到头打印链表

力扣对应链接:LCR 123. 图书整理 I - 力扣(LeetCode)

牛客对应连接:从尾到头打印链表_牛客题霸_牛客网

核心考点 :链表相关,多结构混合使用,递归。


一、《剑指Offer》内容


二、分析问题

这道题整体的解决思路很多,可以使用 stack,也可以将数据保存数组,再逆序数组,还可以递归。


三、代码

1、方法一(stack,但这种方式会有内存占用过多的问题)

//牛客代码
/**
*  struct ListNode {
*        int val;
*        struct ListNode *next;
*        ListNode(int x) :
*              val(x), next(NULL) {
*        }
*  };
*/
class Solution {
private:
    stack<int> st;
    vector<int> res;
public:
    vector<int> printListFromTailToHead(ListNode* head) {
        while(head)
        {
            st.push(head->val);
            head=head->next;
        }
        while(st.size())
        {
            res.push_back(st.top());
            st.pop();
        }
        return res;
    }
};
 
//力扣代码
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
private:
    stack<int> st;
    vector<int> res;
public:
    vector<int> reverseBookList(ListNode* head) {
        while(head)
        {
            st.push(head->val);
            head=head->next;
        }
        while(st.size())
        {
            res.push_back(st.top());
            st.pop();
        }
        return res;
    }
};

2、方法二(逆置数组)

//牛客代码
/**
*  struct ListNode {
*        int val;
*        struct ListNode *next;
*        ListNode(int x) :
*              val(x), next(NULL) {
*        }
*  };
*/
class Solution {
private:
    vector<int> res;
public:
    vector<int> printListFromTailToHead(ListNode* head) {
        while(head)
        {
            res.push_back(head->val);
            head=head->next;
        }
        reverse(res.begin(), res.end());
        return res;
    }
};
 
//力扣代码
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
private:
    vector<int> res;
public:
    vector<int> reverseBookList(ListNode* head) {
        while(head)
        {
            res.push_back(head->val);
            head=head->next;
        }
        reverse(res.begin(), res.end());
        return res;
    }
};

3、方法三(递归方式)

//牛客代码
/**
*  struct ListNode {
*        int val;
*        struct ListNode *next;
*        ListNode(int x) :
*              val(x), next(NULL) {
*        }
*  };
*/
class Solution {
private:
    vector<int> res;
public:
    void reversePrint(ListNode* head)
    {
        if(head==nullptr) return;
        reversePrint(head->next);
        res.push_back(head->val);
    }
    vector<int> printListFromTailToHead(ListNode* head) {
        reversePrint(head);
        return res;
    }
};
 
//力扣代码
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
private:
    vector<int> res;
public:
    void reversePrint(ListNode* head)
    {
        if(head==nullptr) return;
        reversePrint(head->next);
        res.push_back(head->val);
    }
    vector<int> reverseBookList(ListNode* head) {
        reversePrint(head);
        return res;
    }
};


相关文章
|
1月前
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
46 0
|
1月前
|
存储 算法 安全
HashMap常见面试题(超全面):实现原理、扩容机制、链表何时升级为红黑树、死循环
HashMap常见面试题:红黑树、散列表,HashMap实现原理、扩容机制,HashMap的jd1.7与jdk1.8有什么区别,寻址算法、链表何时升级为红黑树、死循环
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 22. 链表中倒数第k个节点
Leetcode题目"剑指 Offer 22. 链表中倒数第k个节点"的Python解决方案,使用双指针法找到并返回链表中倒数第k个节点。
52 5
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 18. 删除链表的节点
Leetcode题目"剑指 Offer 18. 删除链表的节点"的Python解决方案,通过使用双指针法找到并删除链表中值为特定数值的节点,然后返回更新后的链表头节点。
41 4
|
3月前
|
存储 算法 Python
【面试题】合井K个升序链表
【面试题】合井K个升序链表
35 0
|
3月前
|
存储 Java
【Java集合类面试十】、HashMap中的循环链表是如何产生的?
在多线程环境下,HashMap在扩容时如果发生条件竞争,元素的插入顺序可能形成循环链表,导致死循环。
|
3月前
|
安全 编译器 C++
【剑指offer】2.2编程语言(p22-p25)——面试题1:string赋值运算函数
【剑指offer】2.2编程语言(p22-p25)——面试题1:string赋值运算函数
|
5月前
|
存储 SQL 算法
LeetCode 83题:删除排序链表中的重复元素【面试】
LeetCode 83题:删除排序链表中的重复元素【面试】
|
6月前
【一刷《剑指Offer》】面试题 23:从上往下打印二叉树
【一刷《剑指Offer》】面试题 23:从上往下打印二叉树
|
6月前
【一刷《剑指Offer》】面试题 22:栈的压入、弹出系列
【一刷《剑指Offer》】面试题 22:栈的压入、弹出系列