法1:迭代写法
/**
* 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 (head == null || head.next == null) {
return head;
}
ListNode dummy = new ListNode(-1);
dummy.next = head;
ListNode preStart = dummy, postEnd = dummy; // 记录要反转链表串的前驱, 后继结点
while (left > 1) {
preStart = preStart.next;
--left;
}
while (right >= 0) {
postEnd = postEnd.next;
--right;
}
// 翻转[preStart.next, postEnd)之间的结点
ListNode pre = null, cur = preStart.next;
while (cur != postEnd) {
ListNode next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
}
preStart.next = pre; // 前段连接翻转后的起点
cur = pre;
while (cur.next != null) {
cur = cur.next;
}
cur.next = postEnd; // 翻转后的终点连接后段
return dummy.next;
}
}