Descripción del Título
Invierta el intervalo entre la posición my la posición n de una lista vinculada. Entre ellos: 1 <= m <= n <= longitud de la lista enlazada
Ejemplo
1 -> 2 -> 3 -> 4 -> 5 -> nulo, m = 2, n = 4
=> 1 -> 4 -> 3 -> 2 -> 5 -> nulo
Solución
- Ubíquese en el encabezado de la sección de la lista vinculada que desea revertir y registre
- Coloque al final del intervalo de la lista enlazada que desee invertir y registre
- Lista enlazada de intervalo inverso
- Conexión delantera y trasera
Complejidad del tiempo: O (n)
Complejidad espacial: 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;
}
}