最近在学c++和数据结构,做些题目练练手,虽然都比较简单的题目,但是我感觉我对于算法和数据结构这方面的知识点比较缺乏,记录一下。
题目:
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
示例 1:
输入:head = [1,3,2]
输出:[2,3,1]
思路:
这道题目还是比较简单,我使用到了c++自带的两个容器,vector和stack,stack容器的底层数据结构是栈,不知道这些容器,可以看一下这篇博客c++容器总结。
解答:
class Solution {
public:
vector<int> reversePrint(ListNode* head) {
vector<int> v1;
stack<int> s1;
while(head!=NULL){
s1.push(head->val);
head=head->next;
}
while(s1.empty()!=1){
v1.push_back(s1.top());
s1.pop();
}
return v1;
}
};
第二种解法:
下面这种解法,主要是使用数据结构第二种的链表的知识点
,就是使用两个指针一个指向头结点,一个指向尾结点,然后把头结点的数据依次移到尾结点后面,然后当头结点的指针等于尾结点指针的时候,转置完成。
class Solution {
public:
vector<int> reversePrint(ListNode* head) {
vector<int> v1;
ListNode *p,*q;
p=q=head;
if(p!=NULL){
while(q->next!=NULL){
q=q->next;
}
while(p!=q){
ListNode *t;
t=p;
p=p->next;
t->next=q->next;
q->next=t;
}
while(p!=NULL){
v1.push_back(p->val);
p=p->next;
}
}
return v1;
}
};
我感觉我还是挺菜的,我一个人就贡献了30多次的错误。