19 Elimine el penúltimo nodo Nth de la lista vinculada (utilizando la función recursiva)

1. Descripción del problema:

Dada una lista vinculada, elimine el penúltimo nodo enésimo de la lista vinculada y devuelva el nodo principal de la lista vinculada.

Ejemplos:

Dada una lista vinculada: 1-> 2-> 3-> 4-> 5, yn = 2.

Cuando se elimina el penúltimo nodo, la lista vinculada se convierte en 1-> 2-> 3-> 5.
Explicación:

La garantía n dada es válida.

Avanzado:

¿Puedes intentar usar un escaneo de una pasada?

Fuente: LeetCode
Enlace: https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list

2. Análisis de pensamiento:

① El problema aún es fácil de entender, porque se eliminará el enésimo último nodo, así que pensé en usar la recursión para resolverlo. Debido a que la recursión regresará capa por capa al resolver, podemos usar esta función para resolver este problema. Regresar una vez y calcular una vez significa el número actual de nodos, por lo que debe usar una variable global para registrar el número de nodos que se devuelven actualmente de atrás hacia adelante. Al juzgar el número de nodos, podemos comparar El nodo de destino que debe eliminarse, si se descubre que el nodo actual es el nodo que debe eliminarse, devuelve directamente el resultado del final de la llamada recursiva, porque el siguiente nodo que regresa a esta capa es el nodo actual y este nodo debe eliminarse Simplemente regrese directamente al siguiente nodo, este elemento se ignora cuando el nodo está conectado

② Cuando se descubre que el nodo actual no es el nodo eliminado, debe apuntar el siguiente campo de puntero del nodo actual al siguiente nodo devuelto por la llamada recursiva, es decir, conectar el nodo actual con el nodo después del nodo actual (después de cada método recursivo Entonces, el resultado devuelto es el siguiente nodo del nodo actual) La idea es relativamente simple: es más claro mirar el código

③ El uso de la función recursiva de retorno capa por capa es bastante beneficioso, especialmente el tipo que necesita calcular el resultado de atrás hacia adelante, pero el método convencional solo puede usar esta función de derecha a derecha. Es muy conveniente, y la recursión no es solo Solo se puede calcular desde atrás o desde adelante, porque el cálculo se puede llamar antes del método recursivo y la llamada después del método recursivo es de atrás hacia adelante

3. El código es el siguiente:

public class Solution {
    int count = 0;
    public ListNode removeNthFromEnd(ListNode head, int n) {
        /*使用递归来进行修改*/
        if (head == null) return null;
        ListNode cur = removeNthFromEnd(head.next, n);
        count++;
        if (count == n){
            return cur;
        }else{
            head.next = cur;
            return head;
        }
    }
}

 

569 artículos originales publicados · Me gusta 153 · Visitas 590,000+

Supongo que te gusta

Origin blog.csdn.net/qq_39445165/article/details/105377009
Recomendado
Clasificación