题目描述
输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。
想法:
直接用单链表反转,然后遍历,结果报错:
什么递归太多啥的,估计是因为我这样子跑的时间太长了,毕竟单链表的反转自认没写错。
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) :
* val(x), next(NULL) {
* }
* };
*/
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
//单链表:反转,直接改指针指向
ListNode* pre = head;
ListNode* cur = head->next;
ListNode* pnext;
vector<int> arrayList;
if(head==NULL)
return arrayList;
while(cur)
{
pnext = cur->next;
cur->next = pre;
pre = cur;
cur = pnext;
}
head->next = NULL;
while(pre)
{
arrayList.push_back(pre->val);
pre = pre->next;
}
return arrayList;
}
};
既然错了,那咱换个姿势,改用栈。
emm,过了。
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) :
* val(x), next(NULL) {
* }
* };
*/
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
//单链表:反转,直接改指针指向
stack<int> st;
vector<int> arrayList;
if(head==NULL)
return arrayList;
while(head)
{
st.push(head->val);
head = head->next;
}
while(!st.empty())
{
arrayList.push_back(st.top());
st.pop();
}
return arrayList;
}
};
顺手把单链表的反转也刷了,反正都写了
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* ReverseList(ListNode* pHead) {
//单链表:反转,直接改指针指向
ListNode* pre = pHead;
ListNode* cur = pHead->next;
ListNode* pnext;
vector<int> arrayList;
if(pHead==NULL)
return NULL;
while(cur)
{
pnext = cur->next;
cur->next = pre;
pre = cur;
cur = pnext;
}
pHead->next = NULL;
return pre;
}
};