Leetcode链表206. 反转链表
题目描述
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
题解
解法一:使用外部空间存储
计算出链表长度,然后使用动态数组存储每个节点的值,逆序赋给链表
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* p = head;
ListNode* q = head;
ListNode* ans = head;
int n = 0;
while(p != NULL){
p = p->next;
n++;
}
int *a;
a = new int[n];
int i=0;
while(q != NULL){
a[i++] = q->val;
q = q->next;
}
while(head != NULL){
head->val = a[--i];
head = head->next;
}
return ans;
}
};
解法二:迭代法
使用两个指针,cur:遍历节点 pre:指向当前节点的前一个节点
遍历节点,使当前节点的next指向前一个节点
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* pre = NULL;
ListNode* cur = head;
while (cur != NULL){
ListNode* temp = cur->next;
cur->next = pre;
pre = cur;
cur = temp;
}
return pre;
}
};
解法三:改装版迭代
head是反转后的尾节点,最后让head指向NULL;
初始化cur指向head;
每次让head->next->next 指向 cur,实现局部反转;
每次让head 和cur 前进一步;
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* cur = head;
if(head == NULL) return NULL;
while(head->next != NULL){
ListNode* temp = head->next->next;
head->next->next = cur;
cur = head->next;
head->next = temp;
}
return cur;
}
};
解法四:递归
我们假设递归完成,递推到中间第K个节点,第K个节点之后的节点都已经完成反转,我们现在要对第K个节点进行反转,即让第K+1个节点的next指向第K个节点:head->next->next=head;
递归终止条件:head->next == NULL
最终让原来头节点的下一个节点指向NLL即可
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if(head == NULL || head->next == NULL)
return head;
ListNode* ret = reverseList(head->next);
head->next->next = head;
head->next = NULL;
return ret;
}
};