1、题目描述
给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。
2、算法分析
范围内的链表翻转,思路:
①定义虚拟结点,辅助作用
②定义结点pre指向dummyHead,p指向dummyHead.next的结点
③将pre,p结点分别往后走,p指向待反转链表范围的第一个结点。
④范围内反转,使用头插法反转。
3、代码实现
/**
* 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) {
if(left > right){
return head;
}
ListNode dummyHead = new ListNode(0);
dummyHead.next = head;
// 定义虚结点
ListNode pre = dummyHead;
ListNode p = dummyHead.next;
// 往后走
for(int i = 0;i < left - 1;i++){
pre = pre.next;
p = p.next;
}
// 范围内翻转
for(int i = 0;i < right - left;i++){
ListNode cur = p.next;
p.next = p.next.next;
cur.next = pre.next;
pre.next = cur;
}
return dummyHead.next;
}
}