题目描述
输入一个链表,按链表从尾到头的顺序返回一个ArrayList。
本题知识点:链表
看到这道题:第一个想到的就是首先存到vector里,然后reverse
代码如下:
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) :
* val(x), next(NULL) {
* }
* };
*/
vector<int> printListFromTailToHead(ListNode* head) {
vector<int> res;
if(head==nullptr) return res;
while(head)
{
res.push_back(head->val);
head=head->next;
}
reverse(res.begin(), res.end());
return res;
}
然后,我又想到了栈的先进后出的特性,于是,我先把链表中的元素逐个存到栈中,然后从栈中放到vector中。
代码如下:
vector<int> printListFromTailToHead(ListNode* head) {
vector<int> res;
if(head==nullptr) return res;
stack<int> st;
while(head)
{
st.push(head->val);
head=head->next;
}
while(!st.empty())
{
res.push_back(st.top());
st.pop();
}
return res;
}
我们是不是还可以先把链表反转,然后再遍历一次,存到vector里
代码如下:
vector<int> printListFromTailToHead(ListNode* head) {
vector<int> res;
if(head==nullptr||head->next==nullptr) return res;
ListNode dummy(-1);
dummy.next=head;
ListNode* p=dummy.next;
ListNode* temp=p->next;
while(temp)
{
p->next=temp->next;
temp->next=dummy.next;
dummy.next=temp;
temp=p->next;
}
ListNode* cur=dummy.next;
while(cur)
{
res.push_back(cur->val);
cur=cur->next;
}
return res;
}
参考链表反转总结:链表反转总结
方法二:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* pre=NULL;
ListNode* cur=head;
while(cur)
{
ListNode* temp=cur->next;
cur->next=pre;
pre=cur;
cur=temp;
}
return pre;
}
};