Inversión de lista vinculada (LeetCode206
Idea:
Método 1: definir un nodo virtual,
recorrer la lista vinculada e insertar los elementos de la lista vinculada uno por uno en el encabezado->siguiente del nodo virtual.
Código:
public static Node linkedListReverse(Node node ){
//创建虚拟节点
Node node1 = new Node(-1); //-1 null
Node cur = node; // 1 2 3 4
while (cur!=null){
//获取原链表的的next
Node next = cur.next; //2 3 4 3 4
//获取原链表的头节点指向虚拟节点的next
cur.next = node1.next; //1 null 2
//虚拟节点的next指向拼接的好的链表
node1.next = cur;//-1 1
cur = next; //2 3 4
}
return node1.next;
}
Método 2: operar directamente la lista vinculada para lograr la reversión
Código:
//直接操作数组实现
public static Node reverseList(Node node ){
Node pre = null;
Node cur = node;
while (cur!=null){
Node next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
}
return pre;
}
En realidad, no hay mucha diferencia entre los dos métodos, es solo una cuestión de objetos nuevos o no nuevos.
Método 3: utilizar la recursividad para implementar
Código:
//递归实现
public static Node recurtionList(Node node ){
if(node ==null || node.next==null){
return node;
}
Node newNode = recurtionList(node.next);
node.next.next = node;
node.next = null;
return newNode;
}