指定区间反转
LeetCode 92
头插法
//1.头插法,3到2前面,4到3前面
public ListNode reverseBetween(ListNode head, int left, int right) {
ListNode pre = new ListNode(-1);
pre.next = head;
ListNode pre2 = pre;
for (int i = 0; i < left - 1; i++) {
pre2 = pre2.next;
}
ListNode cur = pre2.next;
for (int i = 0; i < right - left; i++) {
ListNode next = cur.next;
cur.next = next.next;
next.next = pre2.next;
pre2.next = next;
}
return pre.next;
}
分成三段,反转中间那段,依次进行拼接
public ListNode reverseBetween(ListNode head, int left, int right) {
ListNode pre = new ListNode(-1);
pre.next = head;
ListNode pre2 = pre;
//到left节点前一个结点
for (int i = 0; i < left - 1; i++) {
pre2 = pre2.next;
}
//从pre2再走right-left+1步,来到right节点
ListNode rightNode = pre2;
for (int i = 0; i < right - left + 1; i++) {
rightNode = rightNode.next;
}
//切出一个子链表
ListNode leftNode = pre2.next;
ListNode suc = rightNode.next;
rightNode.next = null;
//反转链表的子区间
reverse(leftNode);
//进行拼接
pre2.next = rightNode;
leftNode.next = suc;
return pre.next;
}
private void reverse(ListNode head) {
ListNode pre = null;
ListNode cur = head;
while (cur != null) {
ListNode next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
}
}