前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【剑指offer|4.从尾到头打印单链表】

【剑指offer|4.从尾到头打印单链表】

作者头像
MicroFrank
发布2023-04-09 09:26:25
1790
发布2023-04-09 09:26:25
举报
文章被收录于专栏:同步文章1234同步文章1234

0.从尾到头打印单链表

image-20230408151740236
image-20230408151740236

单链表:一般给的都是无头节点的 另外:在面试中,如果我们打算修改输入的数据,则最好问一下面试官是不是允许修改

下面这种先把链表节点的值按链表序放到数组中,然后来一个算法库中的reverse属实有点流氓!不可取!

代码语言:javascript
复制
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    vector<int> reversePrint(ListNode* head) {
        ListNode* cur=head;
        vector<int> v;
        while(cur)
        {
            v.push_back(cur->val);
            cur=cur->next;
        }
        v.reverse(v.begin(),v.end());//先放到数组,然后逆置
        return v;
    }
};

1.修改链表的方法

image-20230408162925599
image-20230408162925599
image-20230408162944233
image-20230408162944233
代码语言:javascript
复制
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    vector<int> reversePrint(ListNode* head) {
        //链表逆置
        ListNode* prev=nullptr;
        ListNode* cur=head;
        while(cur)
        {
            ListNode* next=cur->next;
            cur->next=prev;

            prev=cur;
            cur=next;
        }
        head=prev;

        //头节点的指针现在是prev的位置
        cur=head;
        vector<int> v;
        while(cur)
        {
            v.push_back(cur->val);
            cur=cur->next;
        }
        return v;
    }
};

2.不修改链表的方法-栈

代码语言:javascript
复制
/**
 * Definition for singly-linked list.单链表:一般给的都是无头节点的
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    vector<int> reversePrint(ListNode* head) {
        stack<ListNode*> st;
        vector<int> v;
        ListNode* cur=head;
        while(cur!=nullptr)
        {
            st.push(cur);
            cur=cur->next;
        }
        while(!st.empty())
        {
            cur=st.top();
            v.push_back(cur->val);
            st.pop();
        }
        return v;
    }
};

3.不修改链表的方法-递归

由于递归本身就是栈结构,自然想到用递归来实现

代码语言:javascript
复制
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
//vector<int> v; 不能定义在这里
class Solution {
public:
    vector<int> v;
    vector<int> reversePrint(ListNode* head) {
        //vector<int> v;不能定义在这里
        if(head!=nullptr)
        {
            if(head->next!=nullptr)
            {
                reversePrint(head->next);
            }
            v.push_back(head->val);
        }
        return v;
    }
};

注意这里定义vector< int>的两个坑: 坑1:在递归这里我们不能vector定义的成局部的

image-20230408155253305
image-20230408155253305
image-20230408155939607
image-20230408155939607

坑2:不能定义成全局的,我猜测这里是因为力扣OJ在设计测试用例的时候,是通过一下代码来测试的----------------每次都会定义Solution类型的对象然后来调用,所以每一个测试用例就有一个vector< int>的重新定义,而不是像全局的vector< int>在整个main函数内使用的是同一个。

代码语言:javascript
复制
int main()
{
    vector<int> v;
    Solution s;
    v=s.reversePrint(phead1);
    //Print()
    Solution s;
    v=s.reversePrint(phead2);
    //Print()
    Solution s;
    v=s.reversePrint(phead3);
    //Print()
    return 0;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-04-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0.从尾到头打印单链表
  • 1.修改链表的方法
  • 2.不修改链表的方法-栈
  • 3.不修改链表的方法-递归
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档