题目
给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置right 的链表节点,返回 反转后的链表 。
思路
记录left
前面一个节点,在left
和right
之间用头插法(实现反转),right
之后用尾插法(顺序不变)
class Solution {
public ListNode reverseBetween(ListNode head, int left, int right) {
ListNode dummy = new ListNode(0);
dummy.next = head;
//p指向left前一个节点,q指向left,其中p是不变的,因为都是插在p的后面,而q是变化的
ListNode p = dummy;
ListNode q = dummy.next;
for(int i = 1; i < left; i++){//位置从1开始算起,走到left前一个节点停
p = p.next;
q = q.next;
}
//头插法插入节点
for(int i = 0; i < right - left; i++){//一共有right - left + 1个节点待插入
//取出要头插的节点
ListNode temp = q.next;
q.next = q.next.next;
//头插法插入,相当于把temp插入到p和q中间
temp.next = p.next;//这里不要用temp.next = q,因为q的位置是随时变化的
p.next = temp;
}
return dummy.next;
}
}