【Título】
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?
【Pensamiento】
Establezca dos punteros, un puntero atraviesa normalmente y un puntero atraviesa más tarde. Al atravesar hacia atrás, realice una operación de resta en n, una vez que n es 0, comienza a moverse y el puntero retrasado comienza a moverse
1 / * * 2 * Definición de lista individualmente vinculada. 3 * struct ListNode { 4 * int val; 5 * struct ListNode * next; 6 *}; 7 * / 8 9 10 struct ListNode * removeNthFromEnd ( struct ListNode * head, int n) { 11 struct ListNode * ptr = head; 12 struct ListNode * delayN = head; 13 while (ptr-> next! = NULL) { 14 if (n> 0 ) 15 n-- ; 16 más 17 delayN = delayN-> next; 18 ptr = ptr-> siguiente; 19 } 20 if (n == 0 ) 21 delayN-> next = delayN-> next-> next; 22 más 23 cabeza = cabeza-> siguiente; 24 cabezales de retorno ; 25 }
[Análisis de error]
Al principio no había línea22 línea23, había un error para [1] 1. En este momento, n no realiza la operación de sustracción, que no es 0, por lo que es para eliminar el nodo principal. ! !
【Resultado】
0ms 100%
5.4MB 100%
Pero no hay gratis esto es un problema QWQ
Si eres más riguroso ... no es un doble cien QAQ
1 struct ListNode * removeNthFromEnd ( struct ListNode * head, int n) { 2 struct ListNode * ptr = head; 3 struct ListNode * delayN = head; 4 while (ptr-> next! = NULL) { 5 if (n> 0 ) 6 n-- ; 7 más 8 delayN = delayN-> siguiente; 9 ptr = ptr-> siguiente; 10 } 11 if (n == 0 ) { 12 struct ListNode * s = delayN-> next; 13 delayN-> next = delayN-> next-> next; 14 gratis (s); 15 } 16 else { 17 struct ListNode * s = head; 18 cabeza = cabeza-> siguiente; 19 gratis (s); 20 } 21 cabeza de retorno ; 22 }
【Resultado】
4ms 73.58%
5.6MB 100%