题目
给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。
代码
package LeetCode92;
class ListNode {
int val;
ListNode next;
ListNode() {}
ListNode(int val) { this.val = val; }
ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}
class Solution {
ListNode nextnode=null;//后继结点声名
public ListNode reverseBetween(ListNode head, int left, int right) {
// 逆转前N个结点方法
if (left==1){
return reverseN(head,right);
}
head.next=reverseBetween(head.next,left-1,right-1);//向前递归,并改变next结点
return head;//最终输出的第一次调用的head,也就是说链表的第一个结点
}
ListNode reverseN(ListNode head,int n){//翻转前n个结点
if (n==1){
nextnode= head.next;//获取翻转部分的下一个结点
return head;//返回要反转的最后一个结点
}
// 递归翻转
ListNode last =reverseN(head.next,n-1);
// 翻转操作
head.next.next=head;
head.next=nextnode;
return last;//返回翻转最后结点
}
}
方法
- 要旋转中间某部分的链表,那就一直访问到要调用的结点,然后翻转前N个结点
- 需要记录反转结点后继一个结点,翻转后需要接上
- 注意维护下一个结点