题目描述:
给你单链表的头节点 head
,请你反转链表,并返回反转后的链表。
示例 1:
输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1]
逻辑:
1: 面对这个题一下子能想到就是栈的结构,先逐个将链表的节点存入栈中,再挨个从栈中取出,取出过程中,改变节点的next指针即可。
2: 由栈其实又可以想到递归,栈的数据结构和递归非常相似,一定要去习惯联想;
3:(三兄弟当然是在一起的)迭代法,这三个基本一直在一起。
#if 1
class Solution {
public:ListNode* reverseList(ListNode* head) {return recur(head, nullptr); // 调用递归并返回}
private:ListNode* recur(ListNode* cur, ListNode* pre) {if (cur == nullptr) return pre; // 终止条件ListNode* res = recur(cur->next, cur); // 递归后继节点cur->next = pre; // 修改节点引用指向return res; }
};
#endif
#if 0
class Solution {
public:ListNode* reverseList(ListNode* head) {ListNode *cur = head, *pre = nullptr;while(cur != nullptr) {ListNode* tmp = cur->next; // 暂存后继节点 cur.nextcur->next = pre; // 修改 next 引用指向pre = cur; // pre 暂存 curcur = tmp; // cur 访问下一节点}return pre;}
};
#endif
递归的一个基本结构:
终止条件;向下传递;实际行为;返回上一层;