题目链接:https://leetcode.cn/problems/reverse-linked-list-ii/description/?envType=study-plan-v2&envId=top-interview-150
头节点插入法,设置一个虚拟节点,不断循环到要反转的前面一个位置,哪怕是1也能包含进去。接着反转,需要记录一开始的节点,这是反转后最后的一个节点,要指向反转完后的一个节点。中间直接头插法即可。
class Solution {
public ListNode reverseBetween(ListNode head, int left, int right) {
//设置头节点,连到整个链表前面,这样子可以将left=1的情况囊括进去
//dummyNode不应该动
ListNode dummyNode = new ListNode(0,head);
ListNode pre = dummyNode;
for(int i = 1;i <= left-1;i++)
pre = pre.next;
//目前已经到了要翻的第一个节点的前面一个节点,开始翻转
//从3开始翻转,2自己会跑到最后
ListNode p = pre.next.next;
//记录翻转过后的最后一个节点
ListNode end = pre.next;
for(int i = 1;i <= right-left;i++){
end.next = p.next;
ListNode temp = pre.next;
pre.next = p;
p = p.next;
pre.next.next = temp;
}
return dummyNode.next;
}
}