前言
前言大家好,今天是@LetItbeSun 坚持每日两题的第22天.
题目
难度中等796
给你单链表的头指针 head
和两个整数 left
和 right
,其中 left <= right
。请你反转从位置 left
到位置 right
的链表节点,返回 反转后的链表 。
示例 1:
输入:head = [1,2,3,4,5], left = 2, right = 4 输出:[1,4,3,2,5]
示例 2:
输入:head = [5], left = 1, right = 1 输出:[5]
提示:
- 链表中节点数目为
n
1 <= n <= 500
-500 <= Node.val <= 500
1 <= left <= right <= n
思路
递归的思路,首先简单的反转链表,反转整个链表,head->next是递归变量
考虑递归出口
ListNode* reverse(ListNode* head) {
//反转整个链表
if(head->next== nullptr){ //递归出口 只有一个节点
return head;
}
ListNode* last=reverse(head->next);
head->next->next=head;
head->next= nullptr;
return last;
}
然后是考虑反转链表前N个元素,依然是递归的思路,记录以下第n个元素后面的元素,
递归的变量有两个,一个是head,一个是n,
递归出口是n==1
ListNode* successor = nullptr;
ListNode* reverseN(ListNode* head, int n){ //反转链表前n个元素第二种写法 参考labuladong
if(n==1){
successor=head->next;
return head;
}
ListNode* last=reverseN(head->next,n-1);
head->next->next=head;
head->next=successor;
return last;
}
代码
#include <iostream>
#include <algorithm>
#include <map>
#include <vector>
using namespace std;
//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) {}
};
/*ListNode* reverseBetween(ListNode* head, int left, int right) {
}*/
ListNode* reverse(ListNode* head) {
//反转整个链表
if(head->next== nullptr){ //递归出口 只有一个节点
return head;
}
ListNode* last=reverse(head->next);
head->next->next=head;
head->next= nullptr;
return last;
}
/*ListNode* reverseN1(ListNode* head, int n){ //反转链表前n个元素第一种写法 自己想的
if(n==1){
return head;
}
ListNode* last=reverseN1(head->next,n-1);
ListNode* t=head->next->next;
head->next->next=head;
head->next=t;
return last;
}*/
ListNode* successor = nullptr;
ListNode* reverseN(ListNode* head, int n){ //反转链表前n个元素第二种写法 参考labuladong
if(n==1){
successor=head->next;
return head;
}
ListNode* last=reverseN(head->next,n-1);
head->next->next=head;
head->next=successor;
return last;
}
ListNode* reverseBetween(ListNode* head, int left, int right) {
if(left==1){
return reverseN(head,right-left+1); //前right-left+1个元素
}
head->next=reverseBetween(head->next,left-1,right-1);
return head;
}
int main(){
ListNode a(1);
ListNode b(2);
ListNode c(3);
ListNode d(4);
ListNode e(5);
ListNode f(6);
a.next=&b;
b.next=&c;
c.next=&d;
d.next=&e;
e.next=&f;
// ListNode* t= reverse(&a); //反转整个链表
//输出链表看看
ListNode* t= reverseBetween(&a,2,4);
while(t!=nullptr){
cout<<t->val<<" ";
t = t->next;
}
return 0;
}