定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
限制:
0 <= 节点个数 <= 5000
题源链接:https://leetcode-cn.com/problems/fan-zhuan-lian-biao-lcof
- 定义两个指针: pre 和 cur ;pre 在前 cur 在后。
- 每次让 pre 的 next 指向 cur ,实现一次局部反转
- 局部反转完成之后, pre 和 cur 同时往前移动一个位置
- 循环上述过程,直至 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 == NULL) {
return NULL;
}
// 声明两个指针
ListNode *cur = NULL, *pre = head;
while(pre != NULL) {
// 使用临时变量存储,per->next
ListNode *temp = pre->next;
// 反转,下一个节点的下一个节点就是当前节点
pre->next = cur;
// cur 向前移动一位
cur = pre;
// pre 向前移动一位
pre = temp;
}
return cur;
}
};
递归解法
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if (head == nullptr || head->next == nullptr) return head;
ListNode* ans = reverseList(head->next);
head->next->next = head;
head->next = nullptr;
return ans;
}
};
复杂度分析:
时间复杂度:Q(N),依次从头扫描到末端。
空间复杂度:Q(1)