反转链表 II
给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。
后面有图片,更容易理解
/**
* Definition for singly-linked list.
* public 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 {
public ListNode reverseBetween(ListNode head, int left, int right) {
//定义虚拟节点,方便返回
ListNode dummyNode =new ListNode(0);
dummyNode.next=head;
//找到pre节点
ListNode pre=dummyNode;
for(int i = 0; i<left-1; i++){
pre=pre.next;
}
//找到right节点
ListNode rightNode=pre;
for(int i=0 ;i<right-left+1;i++){
rightNode=rightNode.next;
}
//找到left和succ节点
ListNode leftNode=pre.next;
ListNode succ=rightNode.next;
//断开链接
pre.next=null;
rightNode.next=null;
//重新链接
pre.next=reverse(leftNode);
leftNode.next=succ;
return dummyNode.next;
}
public ListNode reverse(ListNode head){
ListNode pre = null;
ListNode curr =head;
while(curr!=null){
ListNode next =curr.next;
curr.next =pre;
pre=curr;
curr=next;
}
return pre;
}
}