AcWing之从尾到头打印链表
題目
輸入一個鏈表的頭結(jié)點(diǎn),按照 從尾到頭 的順序返回節(jié)點(diǎn)的值。 返回的結(jié)果用數(shù)組存儲。樣例
輸入:[2, 3, 5] 返回:[5, 3, 2]方法一:
/* struct ListNode {int val; //當(dāng)前結(jié)點(diǎn)的值ListNode *next; //指向下一個結(jié)點(diǎn)的指針ListNode(int x) : val(x), next(NULL) {} //初始化當(dāng)前結(jié)點(diǎn)值為x,指針為空}; */class Solution {public:vector[HTML_REMOVED] printListReversingly(ListNode* head) {vector [HTML_REMOVED] res;while(head) {res.push_back(head->val);head=head->next; }return vector<int>(res.rbegin(), res.rend()); //不能使用res.end() 倒序只能使用倒序的} };心得
return vector(res.rbegin(), res.rend()); 與 return vector(res.end()-1, res.begin()-1);
附錄1 ListNode
struct ListNode {
int val; //當(dāng)前結(jié)點(diǎn)的值
ListNode *next; //指向下一個結(jié)點(diǎn)的指針
ListNode(int x) : val(x), next(NULL) {} //初始化當(dāng)前結(jié)點(diǎn)值為x,指針為空
};
附錄2 vector使用
介紹
與其它動態(tài)序列容器相比(deques, lists and forward_lists), vector在訪問元素的時候更加高效,在末尾添加和刪除元素相對高效。對于其它不在末尾的刪除和插入操作,效率更低。比起lists和forward_lists統(tǒng)一的迭代器和引用更好。
用法
頭文件
#include<vector>vector聲明及初始化
vector<int> vec; //聲明一個int型向量 vector<int> vec(5); //聲明一個初始大小為5的int向量 vector<int> vec(10, 1); //聲明一個初始大小為10且值都是1的向量 vector<int> vec(tmp); //聲明并用tmp向量初始化vec向量 vector<int> tmp(vec.begin(), vec.begin() + 3); //用向量vec的第0個到第2個值初始化tmp int arr[5] = {1, 2, 3, 4, 5}; vector<int> vec(arr, arr + 5); //將arr數(shù)組的元素用于初始化vec向量//說明:當(dāng)然不包括arr[4]元素,末尾指針都是指結(jié)束元素的下一個元素,//這個主要是為了和vec.end()指針統(tǒng)一。 vector<int> vec(&arr[1], &arr[4]); //將arr[1]~arr[4]范圍內(nèi)的元素作為vec的初始值vector基本操作
(1). 容量
向量大小: vec.size();向量最大容量: vec.max_size();更改向量大小: vec.resize();向量真實(shí)大小: vec.capacity();向量判空: vec.empty();減少向量大小到滿足元素所占存儲空間的大小: vec.shrink_to_fit(); //shrink_to_fit(2). 修改
多個元素賦值: vec.assign(); //類似于初始化時用數(shù)組進(jìn)行賦值 末尾添加元素: vec.push_back(); 末尾刪除元素: vec.pop_back(); 任意位置插入元素: vec.insert(); 任意位置刪除元素: vec.erase(); 交換兩個向量的元素: vec.swap(); 清空向量元素: vec.clear();(3)迭代器
開始指針:vec.begin(); 末尾指針:vec.end(); //指向最后一個元素的下一個位置 指向常量的開始指針: vec.cbegin(); //意思就是不能通過這個指針來修改所指的內(nèi)容,但還是可以通過其他方式修改的,而且指針也是可以移動的。 指向常量的末尾指針: vec.cend();(4)元素的訪問
下標(biāo)訪問: vec[1]; //并不會檢查是否越界 at方法訪問: vec.at(1); //以上兩者的區(qū)別就是at會檢查是否越界,是則拋出out of range異常 訪問第一個元素: vec.front(); 訪問最后一個元素: vec.back(); 返回一個指針: int* p = vec.data(); //可行的原因在于vector在內(nèi)存中就是一個連續(xù)存儲的數(shù)組,所以可以返回一個指針指向這個數(shù)組。這是是C++11的特性。(4)算法
遍歷元素
vector::iterator it;
for (it = vec.begin(); it != vec.end(); it++)
cout << *it << endl;
//或者
for (size_t i = 0; i < vec.size(); i++) {
cout << vec.at(i) << endl;
}
元素翻轉(zhuǎn)
#include
reverse(vec.begin(), vec.end());
元素排序
#include
sort(vec.begin(), vec.end()); //采用的是從小到大的排序
//如果想從大到小排序,可以采用上面反轉(zhuǎn)函數(shù),也可以采用下面方法:
bool Comp(const int& a, const int& b) {
return a > b;
}
sort(vec.begin(), vec.end(), Comp);
總結(jié)
以上是生活随笔為你收集整理的AcWing之从尾到头打印链表的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【DKN】(六)KCNN.py
- 下一篇: 五个同事想计算他们的平均工资,但公司不让