LeetCode206. 反转链表
https://leetcode-cn.com/problems/reverse-linked-list/
题目描述
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
思路
①双指针迭代
申请两个指针pre(最初指向NULL),cur(最初指向head),然后cur不断向后遍历,每次先保存下cur的下一个结点,之后将cur的next指针指向pre,然后pre和cur前进一位
代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
//申请结点,pre和cur,pre指向NULL,cur指向head
ListNode* pre = NULL;
ListNode* cur = head;
while(cur){
//保存cur的下一个结点
ListNode* temp = cur->next;
//将cur的next指针指向pre,进行翻转操作
cur->next = pre;
//更新pre和cur
pre = cur;
cur = temp;
}
return pre;
}
};
复杂度分析:
令 n 为数组长度。
- 时间复杂度: O ( n ) O(n) O(n) 需要遍历链表一次。
- 空间复杂度: O ( 1 ) O(1) O(1)
②递归法
按照双指针法思路来写的递归
代码
class Solution {
public:
ListNode* reverse(ListNode* pre, ListNode* cur){
if(!cur)
return pre;
ListNode* temp = cur->next;
cur->next = pre;
return reverse(cur, temp);
}
ListNode* reverseList(ListNode* head) {
return reverse(NULL, head);
}
};
还有一种递归,稍微难理解一些
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if(head==NULL || head->next == NULL)
return head;
//这里的cur就是最后一个结点
ListNode* cur = reverseList(head->next);
//head的下一个结点的next指针指向head
head->next->next = head;
//防止链表循环,使head的next指针为空
head->next = NULL;
//每层递归都返回cur,也就是最后一个结点
return cur;
}
};