题目描述
将一个链表\m 位置到n 位置之间的区间反转,要求时间复杂度 O(n),空间复杂度O(1)
思路:前m-1部分的节点尾插法,中间m到n-m+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) {
// write code here
ListNode newHead = new ListNode(-1);
newHead.next = head;
ListNode p1 = newHead;
//尾插法插入前m-1个节点
for(int i = 1;i<m && p1 != null;i++){
p1 = p1.next;
}
//头插法将截取部分插入原表
ListNode cur = p1.next;
p1.next = null;//断链,后面的为cur开始头插
ListNode tail = null;
for(int j = 1;j<=n-m+1 && cur != null;j++){
ListNode temp = cur.next;
cur.next = p1.next;
p1.next = cur;
//记录尾指针
if(tail == null){
tail = cur;
}
cur = temp;
}
tail.next = cur;//后面的接上
return newHead.next;
}
}