題目描述
反轉一個單鏈表。
示例:
輸入: 1->2->3->4->5->NULL
輸出: 5->4->3->2->1->NULL
進階:
你可以迭代或遞歸地反轉鏈表。你能否用兩種方法解決這道題?
迭代方法一
這種反轉的題目使用迭代的方法我首先想到的是棧,用棧來保存每個節點的值,然後一個個彈出並將棧頂元素賦給另外一個鏈表,這個新的鏈表就是反轉後的鏈表。代碼如下:
class Solution {
public:
ListNode* reverseList(ListNode* head) {
stack<int> s;
ListNode* pList = head;
ListNode* pNode = head;
ListNode* reverseHead = pNode;
int n;
while(pList != NULL){
s.push(pList->val);
pList = pList->next;
}
while(pNode != NULL){
n = s.top();
s.pop();
pNode->val = n;
pNode = pNode->next;
}
return reverseHead;
}
};
迭代方法二
第二種迭代的方法我們從節點的指針入手,通過改變每個節點指針的方向也就實現了鏈表的反轉。代碼如下:
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode *root=head;
ListNode *pre=NULL;
ListNode *next=NULL;
if(head==NULL) return NULL;
while(root->next){
next=root->next;
root->next=pre;
pre=root;
root=next;
}
root->next=pre;
return root;
}
};
遞歸方法
對應迭代方法二,可以使用相應的遞歸的方法來改變每個節點的指針。
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if (head == NULL || head->next == NULL)
return head;
ListNode* newHead = reverseList(head->next);
head->next->next = head;
head->next = NULL;
return newHead;
}
};