思路
在完成此题目的时候,建议完成206题目。
这道题和206题目十分类似,不同点就是需要指定区域进行链表的反转,需要利用到我们206总结出的两个点
pre指针指向末尾元素
cur指针指向pre指针的下一个位置
如图所示假设我们指定的区域已经完成反转
这里我们找到left
的上一个节记为p0
,那么只需要让p0
节点指向pre
也就是pre.next = pre
,然后在让p0的下一个节点指向cur
也就是pre.next.next = cur
。
注意顺序问题!先执行pre.next.next = cur
。
如何找到P0呢?直接使用遍历即可找到left
的上一个节点,那么需要考虑一个特殊的情况,如果left = 1
,即left没有上个节点,所以我们需要使用虚拟节点dummy。如图所示
代码
/**
* 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(0, head);
ListNode p0 = dummy;
// 从dummy节点开始找到left节点的上一个节点
for (int i = 0; i < left - 1; i++) {
p0 = p0.next;
}
ListNode pre = null;
ListNode cur = p0.next;
for (int i = 0; i < right - left + 1; i++) {
ListNode next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
}
p0.next.next = cur;
p0.next = pre;
return dummy.next;
}
}