给定一个头节点为 head 的单链表用于记录一系列核心肌群训练编号,请将该系列训练编号 倒序 记录于链表并返回。

示例 1:

**输入:**head = [1,2,3,4,5]
输出:[5,4,3,2,1]

示例 2:

**输入:**head = [1,2]
输出:[2,1]

示例 3:

**输入:**head = []
输出:[]

提示:

链表中节点的数目范围是 [0, 5000]

-5000 <= Node.val <= 5000

前面使用双指针写过了,这里采用递归写法

反转链表就是先反转node1后面的链表,再反转node2与node1

也就是说 f(head)的问题可以拆成 f(node2)+node1

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution {
public:
ListNode *trainningPlan(ListNode *head) { return reverseList(head); }
ListNode *reverseList(ListNode *cur) {
if (cur == nullptr || cur->next == nullptr) {
return cur;
}
ListNode *node = reverseList(cur->next);
cur->next->next = cur;
cur->next = nullptr; // 最后尾结点指向null
return node;
}
};