题目:将一个节点数为 size 链表 m 位置到 n 位置之间的区间反转,要求时间复杂度 O(n)O(n),空间复杂度 O(1)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) {
// write code here
if(head == null) return null;
ListNode dummy = new ListNode(-1);
dummy.next = head;
ListNode leftNode,rightNode,preLeftNode,postRightNode;
preLeftNode = dummy;
rightNode = head;
for(int i=1;i<m;i++){
preLeftNode = preLeftNode.next;
}
for(int i=1;i<n;i++){
rightNode = rightNode.next;
}
leftNode = preLeftNode.next;
postRightNode = rightNode.next;
preLeftNode.next = null;
rightNode.next = null;
ListNode pHead = new ListNode(-1);
pHead.next = leftNode;
ListNode node = leftNode;
while(leftNode != null){
ListNode memo = leftNode.next;
leftNode.next = pHead.next;
pHead.next = leftNode;
leftNode = memo;
}
preLeftNode.next = rightNode;
node.next = postRightNode;
return dummy.next;
}
}
解法二:这个就是找到左区间前一个节点 左区间节点 然后每次都将左区间后一个节点采用头插法插入到左区间前一个结点的后一位上去
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 dummy = new ListNode(-1);
dummy.next = head;
ListNode preNode = dummy;
for(int i=1;i<m;i++){
preNode = preNode.next;
}
ListNode curr = preNode.next;
for(int i=m;i<n;i++){
ListNode memo = curr.next;
curr.next = memo.next;
memo.next = preNode.next;
preNode.next = memo;
}
return dummy.next;
}
}