206. 反转链表
题目
方法思路
- 递归版
-
记录子链表的尾结点
-
将head结点放在尾结点后面
代码
迭代版
/**
* 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) {
// 前置结点
ListNode* pre = nullptr;
// 当前结点
ListNode* cur = head;
while (cur) {
ListNode* post = cur->next;
cur->next = pre;
pre = cur;
cur = post;
}
return pre;
}
};
递归版
/**
* 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) {
// 递归注意递归基,当只有一个结点或者结点为空时,反转后的头节点就为head
if (head == nullptr || head->next == nullptr) return head;
// head后面链表反转后,head->next结点就为子链表反转后的尾结点
ListNode* tail = head->next;
// 反转子链表,返回反转后的头节点
ListNode* newHead = reverseList(head->next);
// 将子链表tail结点和head结点连接,实现整个链表反转
tail->next = head;
head->next = nullptr;
return newHead;
}
};
官方题解:206. 反转链表题解