首页 > 其他分享 >剑指 Offer 06. 从尾到头打印链表

剑指 Offer 06. 从尾到头打印链表

时间:2023-05-29 10:31:53浏览次数:55  
标签:head ListNode cur Offer 复杂度 链表 数组 06

剑指 Offer 06. 从尾到头打印链表

</br></br>

题目:

输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。

示例:

输入:head = [1,3,2]
输出:[2,3,1]

限制:

0 <= 链表长度 <= 10000

</br></br>

思路一:

使用reverse函数完成链表的逆序打印。我们通过遍历将链表中的值插入数组中,然后使用reverse完成数组元素的翻转,对数组元素翻转之后打印出的数组元素顺序即是链表从尾到头打印的顺序。

代码如下:

class Solution {
public:
    vector<int> reversePrint(ListNode* head) {
        vector<int> v;
        ListNode* cur = head;
        while(cur)
        {
            v.push_back(cur->val);
            cur = cur->next;
        }
        //reverse函数的时间复杂度为O(N)
        reverse(v.begin(),v.end());
        return v;
    }
};

时间复杂度:O(N)

空间复杂度:O(N)

</br></br>

思路二:

我们可以通过修改链表中next指针的指向,先将链表反转,假设原链表为1->2->3->4->5->nullptr,反转后为5->4->3->2->1->nullptr;然后我们再申请一个数组,通过遍历新链表中的值放入数组中,此时数组中的值就已经是原链表中从尾到头的值。

链表的反转过程如下:

image-20230528171603278

代码如下:

class Solution {
public:
    vector<int> reversePrint(ListNode* head) {
        vector<int> v;
        ListNode* cur = head; //当前节点
        ListNode* prev = nullptr;//前一个节点
        
        //链表的反转
        while(cur)
        {
            ListNode* tmp = cur->next;
            cur->next = prev;
            prev = cur;
            cur = tmp;
        }
        //此时prev就是链表的头节点
        cur = prev;
        //再从新链表的头节点开始遍历插入数组中
        while(cur)
        {
            v.push_back(cur->val);
            cur = cur->next;
        }
        return v;
    }
};

时间复杂度:O(N)

空间复杂度:O(N)

</br></br>

思路三:

根据栈的先进后出的特性,使用栈完成链表的逆序打印。先遍历链表将链表中的值压入栈中,然后再通过top函数和pop函数将栈中的数据依次放入数组中,即可完成链表的逆序打印。

代码如下:

class Solution {
public:
    vector<int> reversePrint(ListNode* head) {
        vector<int> v;
        stack<int> st;
        ListNode* cur = head;
        //将链表中的值压入栈中
        while(cur)
        {
            st.push(cur->val);
            cur = cur->next;
        }
        //将栈中的值依次放入数组中
        while(!st.empty())
        {
            v.push_back(st.top());
            st.pop();
        }
        return v;
    }
};

时间复杂度:O(N)

空间复杂度:O(N)

标签:head,ListNode,cur,Offer,复杂度,链表,数组,06
From: https://blog.51cto.com/u_15562309/6368276

相关文章

  • 剑指 Offer 57 - II. 和为s的连续正数序列
    题目描述:输入一个正整数target,输出所有和为target的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。 方法:滑动窗口(双指针) classSolution{publicint[][]findContinuousSequence(inttarget){inti=1,j......
  • 【LeetCode双向链表】LRU详解,双向链表实战
    LRU缓存请你设计并实现一个满足LRU(最近最少使用)缓存约束的数据结构。实现LRUCache类:LRUCache(intcapacity)以正整数作为容量capacity初始化LRU缓存intget(intkey)如果关键字key存在于缓存中,则返回关键字的值,否则返回-1。voidput(intkey,intvalu......
  • 执行VBA出现3706错误的解决方案
    现在自用电脑只安装wps,没有安装office了,执行vba居然报3706错误,代码调试好了没改动,那么只有一种可能就是数据库连接有问题了。出现这个提示,安装AccessDatabaseEngine.exe,即可Access 2010数据库引擎:https://download.csdn.net/download/weixin_42750611/12409896安装注意事项:①......
  • 海底高铁(洛谷3406)
         #include<iostream>usingnamespacestd;constintN=100010;intp[N];//要去的城市intA[N],B[N],C[N];longlongs,ans[N];//ans差分数组intmain(){intN,M;scanf("%d%d",&N,&M);for(inti=1;i<=M......
  • 学习《操作系统导论》06
    机制地址转换前面说到了关于内存的虚拟化,程序内部使用的其实都是虚拟地址,那么这里就涉及到一个虚拟基地和物理地址的映射方案。类比前面的CPU虚拟化,在CPU虚拟化中,提出了一个概念叫:受限直接运行(LimitedDirectExecution,LDE)。这种模式下,程序本身可以运行大部分指令,也能操作硬件......
  • CSP 202206-3 角色授权
    链接大模拟,用了map,但是TLE了;好在有部分分,能得80.代码如下#include<bits/stdc++.h>usingnamespacestd;intconstN=5005,M=505;intn,m,q,ID[M]; //ID[关联编号]=角色编号stringcurname,curop,curkd,curnm;//当前操作的用户,操作,资源种类,资源名称map<st......
  • 【LeetCode】203. 移除链表元素
    203.移除链表元素思路一:直接删除法(迭代)1.从头结点开始向后遍历,找到等于val的结点;2.假设cur->val=val,那么要让cur的前一个结点prev的next指针指向cur的下一个结点,即prev->next=cur->next。要注意的是当头结点的值等于val时(head->val=val),因为头节点没有前一个结点,所以可......
  • [USACO06NOV]Bad Hair Day S(栈)
    题目大意:按顺序给出n头牛的身高,每头牛可以看见它到后出现的牛中第一头身高高过(大于等于)它的牛之间的所有牛,求所有牛总共能看到的牛数解题思路:从后往前遍历查看每头牛能看到的牛数,每次进行的比较数量的太多,但我们可以用栈来存储关键信息以减少不必要的比较代码如下:#i......
  • CMT206人力中心计算
    CardiffSchoolofComputerScienceandInformaticsCourseworkAssessmentPro-formaModuleCode:CMT206ModuleTitle:HumanCentricComputingAssessmentTitle:EvaluationAndAnalysisOfInterfaceDesignAssessmentNumber:1DateSet:Tuesday31January2023Subm......
  • LeetCode 114. 二叉树展开为链表
    思路1classSolution{public:voidflatten(TreeNode*root){while(root){autop=root->left;if(p)//找到左儿子的右链{while(p->right)p=p->right;//将右链插入......