目录
1、题目链接
2、题目介绍
3、解法
递归法(从前往后递归)
从后往前递归
4、代码
递归法(从前往后递归)
从后往前递归
1、题目链接
206.反转链表
2、题目介绍
3、解法
递归法(从前往后递归)
递归的过程中,记录下当前节点的下一节点,然后将当前节点的next指针指向前一节点,不断递归
从后往前递归
首先判断边缘,当head为空返回空,当head-》next为空就返回head即可,然后调用该函数递归下一个节点,这样就一直递归到最后一个节点,将最后一个节点的next指针指向前一个结点,一直这样递归,然后返回递归后的链表即可
4、代码
递归法(从前往后递归)
/**
* 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* reverse(ListNode* newhead, ListNode* head2)
{
//从前向后 ,进行翻转递归
//newhead 翻转链表之后的“新头节点”
//head2 剩余链表的头节点
if (head2 == NULL)
return newhead;
//temp存储原链表
ListNode* temp = head2->next;
//翻转,更新 反转链表 的头节点为head2
head2->next = newhead;
return reverse(head2, temp);
}
ListNode* reverseList(ListNode* head) {
return reverse(NULL, head);
}
};
从后往前递归
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if(head==NULL)return NULL;
if(head->next==NULL)return head;
ListNode*pre=reverseList(head->next);
head->next->next=head;//让后一个节点指向自己
head->next=NULL;
return pre;
}