题目描述
反转一个单链表。
示例:
输入: 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;
}
};