剑指offer_C++_一天一题_3_从尾到头打印链表

今日碎碎念:今天看牛客网又看到算法诸神黄昏之类的论调,以及一些前辈们劝转开发,总之我现在只能两手准备毕竟之前花时间搞了比赛和文章啊~一年应该差不多 要加油啊~

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

解题思路
链接1:link
链接2:link

知识点
链表
c++链表(详解版)链接: link
b站链表讲解1小时视频 链接: link
ArrayList
1.动态数组,c++当中的一种数据类型,数组的高级形式
C++ ArrayList的使用方法 链接: link

ArrayList List = new ArrayList();
for( int i=0;i<10;i++ ) //给数组增加10个Int元素
List.Add(i); 

2.vector是一个能够存放任意类型的动态数组
vector动态数组(用法) 链接: link

push/push_back/stack/queue 浅析 链接: link

vectortest;//建立一个vector
test.push_back(1);
test.push_back(2);//把1和2压入vector,这样test[0]就是1,test[1]就是2
stack::push();//在栈顶增加元素
queue::push();//将x 接到队列的末端
结构体
c++链表(详解版)链接: link

struct 结构体类型名//struct是关键字
{
    成员表;    //可以有多个成员
    成员函数;  //可以有多个成员函数,也可以没有
}结构体变量表; //可以同时定义多个结构体变量,用“,”隔开 也可以用时再定义

结构体元素访问:
结构体变量名->val
结构体变量名.val
本题中链表结构定义

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

分析:1.C++中要求结构体名字和结构体里的函数同名,就相当于类和构造函数,这个同名的函数是为了初始化这个结构里的成员变量的。所以struct ListNode里面有个同名函数ListNode用于结构体的初始化 2.val(x)用到就是c++中变量赋初值,除了我们常用的赋值号=,还有小括号赋值。3.关于int *p和int* p

int* p, p1; // probable error: p1 is not an int这里,把放得离p近一点也同样不能澄清问题:
int *p, p1; // probable error为了保险起见,只好一次声明一个变量了——特别是当声明伴随着初始化之时。
int* p, p1; // probable error: p1 is not an int*
而int* p = &i;
int p1 = p; // error: int initialized by int*它会报错。

本题代码
解法一:迭代法翻转链表
在这里插入图片描述

vector<int> printListFromTailToHead(ListNode* head) {
    ListNode* pre = nullptr;
    ListNode* cur = head;
    ListNode* temp = cur;
    
    while (cur) {
        temp = cur->next;
        cur->next = pre;
        pre = cur; 
        cur = temp;
    }
    
    vector<int> ret;
    while (pre) {
        ret.push_back(pre->val);
        pre = pre->next;
    }
    return ret;
}

测试结果
在这里插入图片描述
解法二:栈

/**
*  struct ListNode {
*        int val;
*        struct ListNode *next;
*        ListNode(int x) :
*              val(x), next(NULL) {
*        }
*  };
*/
class Solution {
public:
    vector<int> printListFromTailToHead(ListNode* head) {
         vector <int> result;
         stack<int> node;
         ListNode* p=head;
         while(p!=NULL)
         {
              node.push(p->val);
              p=p->next;
         }
         while(!node.empty())
         {
           result.push_back(node.top());  
           node.pop();
         }
         return result;
    }
};

解法三:递归法翻转链表

在这里插入图片描述
参考:
链接1:link
解法四:用现有的std::reverse函数
参考:
链接1:link

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值