題目描述
輸入一個鏈表,按鏈表從尾到頭的順序返回一個ArrayList。
分析:鏈表倒置有兩種思路,第一種是可以從修改節點的next屬性進行倒置,第二種可以把節點放在棧中,然後從棧頂開始取出即可實現倒置的效果
代碼:
第一種:
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
}
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
vector<int> vects;
if (head == NULL)
return vects;
ListNode* q = head; // q從上一個節點指向本節點
ListNode* h = head->next; //p指向節點的後一個節點
ListNode* tempNode; //臨時節點
while (h != NULL) {
tempNode = h->next;
h->next = q;
q = h;
h = tempNode;
}
head->next = NULL;
head = q;
while (head != NULL) {
vects.push_back(head->val);
head = head->next;
}
return vects;
}
};
第二種:
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
vector<int> vects; //利用兩個vector構造棧
vector<int> vectnew;
if (head == NULL)
return vects;
ListNode* h = head;
while (h != NULL) {
vects.push_back(h->val);
h = h->next;
}
for (int i =0; i < vects.size(); i--) //循環 vects.size()-1 次
{
vectnew.push_back(vects.back()); //從後往前取元素
vects.pop_back(); //刪除取過的元素
}
return vectnew;
}
};