一、题目描述
给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。
![](https://img-blog.csdnimg.cn/img_convert/690385c18091473a96d2beb64c2f2ac0.png)
示例 1:
输入:head = [1,2,3,4,5], left = 2, right = 4
输出:[1,4,3,2,5]
示例 2:
输入:head = [5], left = 1, right = 1
输出:[5]
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/reverse-linked-list-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、运行结果
![](https://img-blog.csdnimg.cn/img_convert/17beaa975db3479393f199f0749fcccf.png)
三、解题思路
首先找到第left个结点和第right个结点,lNode指针指向第left个结点的前驱结点,rNode指向第right个结点,然后用头插法的方式(rNode指向的结点看做是链表头),将lNode下一个结点(第left个结点)到rNode结点的前一个结点,逐个插入到rNode结点的后面,实现反转。
四、AC代码
/**
* 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 dummy = new ListNode(-1, head);
ListNode lNode = dummy, rNode = head;
for(int i=1; i<right; i++){ //lNode指向left指向的结点的前驱结点
if(i < left)
lNode = lNode.next;
rNode = rNode.next; // rNode指向第right个结点
}
ListNode p = lNode.next;
while(p != rNode){ // 用头插法将lNode的下一个结点到rNode的前一个结点中的所有节点插入到rNode后面
lNode.next = p.next;
p.next = rNode.next;
rNode.next = p;
p = lNode.next;
}
return dummy.next;
}
}