题目描述
将一个链表m位置到n位置之间的区间反转。其中:1 <= m <= n <= 链表长度
示例
1 -> 2 -> 3 -> 4 -> 5 ->null, m = 2, n = 4
=> 1 -> 4 -> 3 -> 2 -> 5 -> null
解决方法
- 定位到待反转的链表区间头,并记录
- 定位到待反转的链表区间尾,并记录
- 反转区间链表
- 前后连接
时间复杂度:O(n)
空间复杂度:O(1)
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* }
*/
public class Solution {
/**
*
* @param head ListNode类
* @param m int整型
* @param n int整型
* @return ListNode类
*/
public ListNode reverseBetween (ListNode head, int m, int n) {
if (head == null || head.next == null) {
return head;
}
ListNode preNode = null;
ListNode phead = head;
for (int i = 1; i < m; i++) {
preNode = phead;
phead = phead.next;
}
ListNode ptail = phead;
for (int i = 0; i < n - m; i++) {
ptail = ptail.next;
}
ListNode nextNode = ptail.next;
ptail.next = null;
if (preNode == null) {
//特殊情况处理
head = reverse(phead);
} else {
preNode.next = reverse(phead);
}
phead.next = nextNode;
return head;
}
public ListNode reverse (ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode preNode = head;
ListNode target = head.next;
while (target != null) {
preNode.next = target.next;
target.next = head;
head = target;
target = preNode.next;
}
return head;
}
}