题目描述:
将一个节点数为 size 链表 m 位置到 n 位置之间的区间反转,要求时间复杂度 O(n),空间复杂度 O(1)。
例如:
给出的链表为 1→2→3→4→5→NULL, m=2,n=4
返回 1→4→3→2→5→NULL.数据范围: 链表长度 0 <size≤1000,0 <m≤n≤size,链表中每个节点的值满足 |val|≤1000
进阶:时间复杂度 O(n),空间复杂度 O(1)
解题思路:
- 链表的题目,首先就是需要不断的练习,这个题目主要就是弄清楚题目的意思,进行模拟
- 因为最后还需要我们返回这个链表,而且我们需要一个指向之气的pre指针,因此我们为其设置一个临时头节点;
- 因为是m-》n区间内反转,所以我们先走m步,然后到了需要反转的区间内执行区间反转的操作;
- 因为我们设计了一个头节点,只是起到一个占位作用,所以,左右输出的时候,要返回res.next节点
实现代码:
import java.util.*;
//ListNode 结构
/*
* 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) {
// write code here
//占位头节点
ListNode res=new ListNode(-1);
//下一个位置指向head
res.next=head;
//cur 为头节点
ListNode cur=head;
//pre 就是res节点
ListNode pre=res;
//先走m步
for(int i=1;i<m;i++){
pre=cur;
cur=cur.next;
}
//然后m到n区间内反转
for(int i=m;i<n;i++){
ListNode temp=cur.next;
cur.next=temp.next;
temp.next=pre.next;
pre.next=temp;
}
//返回最后的结果
return res.next;
}
}