题目描述
将一个节点数为 size 链表 m 位置到 n 位置之间的区间反转,要求时间复杂度 O(n)O(n),空间复杂度 O(1)O(1)。
例如:
给出的链表为 1→2→3→4→5→NULL, m=2,n=4
返回 1→4→3→2→5→NULL.
数据范围: 链表长度 0<size≤10000<size≤1000,0<m≤n≤size0<m≤n≤size,链表中每个节点的值满足 ∣val∣≤1000∣val∣≤1000
要求:时间复杂度 O(n)O(n) ,空间复杂度 O(n)O(n)
进阶:时间复杂度 O(n)O(n),空间复杂度 O(1)O(1)
示例1
输入:
{1,2,3,4,5},2,4
返回值:
{1,4,3,2,5}
示例2
输入:
{5},1,1
返回值:
{5}
解题思想
以1,2,3,4为例
第一步: 2,1,3,4;
第二步:3,2,1,4;
第三步:4,3,2,1;
为了实现上述步骤,需要一个pre、start和temp变量,来保存节点信息,操作流程如下:
代码实现如下:
public class ListNode {
int val;
ListNode next = null;
public ListNode(int val) {
this.val = val;
}
}
public class Solution {
public ListNode reverseBetween(ListNode head, int m, int n) {
//创建头结点,保存链表第一个节点信息,反转后最后返回第一个节点
ListNode prehead = new ListNode(0);
prehead.next = head;
ListNode prestart = prehead;
ListNode start = head;
//定位
//prestart是要反转区间的前一个节点
//start是要反转区间的第一个节点
for (int i = 1; i<m;i++){
prestart = start;
start = start.next;
}
//反转算法
for (int i = 0; i < m-n; i++) {
ListNode temp = start.next;
start.next = temp.next;
temp.next = prestart.next;
prestart.next = temp;
}
//返回第一个节点
return prehead.next;
}
}
新人一枚,不正确之处多多指正