难度等级:中等
上一篇算法:
力扣此题地址:
给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回反转后的链表 。

此题一共设置四个指针:
指向链表第一个结点的头结点dummynode; 指向left前一个结点的pre;
指向left结点的cur; 指向left下一个结点的next;
分别把他们的位置初始化好,然后开始用while循环进行重定义指针的指向。把需要反转的区间的结点进行反转,每反转一个节点,需要调整三个指针的指向。
因为链表没有索引位置,所以不能一步到位到目标结点位置,所以初始化pre指针的时候只能用for循环来遍历移动到目标位置。
详细过程参考方法二:
- /**
- * 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) {
- // 设置 dummyNode 是这一类问题的一般做法
- ListNode dummyNode = new ListNode(-1,null);
- dummyNode.next = head;
- ListNode pre = dummyNode;
- for (int i = 0; i < left - 1; i++) {
- pre = pre.next;
- }
- ListNode cur = pre.next;
- ListNode next;
- for (int i = 0; i < right - left; i++) {
- next = cur.next;//next要放在循环里,因为next在不断地向后移动
- cur.next = next.next;
- next.next = pre.next;
- pre.next = next;
- }
- return dummyNode.next;
- }
- }