206. 反转链表
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
解题思路: 解法1,2提供了迭代解法,一个是顺着修改链表next指针以反转链表,另一个是采取头插法反转链表,解法3提供了递归解法。
- 顺着遍历
/**
* 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) {
if (!head) return NULL;
ListNode *pre = NULL;
while (head) {
ListNode *next = head->next;
head->next = pre;
pre = head;
head = next;
}
return pre;
}
};
- 头插法
/**
* 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) {
if (!head) return NULL;
ListNode *dummy = new ListNode(-1);
dummy->next = head;
while (head->next) {
ListNode *p = head->next;
head->next = head->next->next;
p->next = dummy->next;
dummy->next = p;
}
head = dummy->next;
delete dummy;
return head;
}
};
- 递归翻转
/**
* 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) {
if (!head || !head->next) return head;
ListNode *newNode = reverseList(head->next);
head->next->next = head;
head->next = NULL;
return newNode;
}
};