[Cepille el registro de preguntas] 29. El k-ésimo nodo desde abajo en la lista enlazada

Llega oferta, cava amigos a recoger! Estoy participando en el evento de registro de reclutamiento de primavera de 2022, haga clic para ver los detalles del evento .

1. Descripción del tema:

Fuente del tema: LeetCode> El k-ésimo último nodo en la lista enlazada

Ingrese una lista vinculada y genere el k-ésimo nodo desde la parte inferior de la lista vinculada. Para ajustarse a los hábitos de la mayoría de las personas, esta pregunta comienza a contar desde 1, es decir, el nodo final de la lista enlazada es el penúltimo nodo.

Por ejemplo, una lista enlazada tiene 6 nodos, comenzando desde el nodo principal, sus valores son 1, 2, 3, 4, 5, 6 en orden. El penúltimo nodo de esta lista enlazada es el nodo con el valor 4.

 

Ejemplo:

Dada una lista enlazada: 1->2->3->4->5, y k = 2.

Volver a la lista enlazada 4->5.

2. Análisis del pensamiento:

Idea uno:

  1. Idea general: algoritmo de búsqueda secuencial
  2. Supongamos que la longitud de la lista enlazada actual es n
  3. El penúltimo k-ésimo nodo de la lista enlazada es el número positivo n - k-ésimo nodo
  4. Atravesando secuencialmente al n - k-ésimo nodo de la lista enlazada es el último k-ésimo nodo.

Idea dos:

  1. Idea general: método de doble puntero (puntero rápido y puntero lento)
  2. Apunte el primer puntero al nodo k+1 de la lista enlazada
  3. El segundo puntero apunta al primer nodo de la lista enlazada
  4. En este punto, la distancia entre los dos punteros es exactamente k nodos
  5. Los dos punteros retroceden sincrónicamente.Cuando el primer puntero alcanza el nodo vacío al final de la lista enlazada, el segundo apunta simplemente al k-ésimo nodo desde la parte inferior de la lista enlazada.
  6. Primero apunte el primer puntero al nodo principal de la lista enlazada, y luego retroceda k pasos, luego el primer puntero solo apunta al k + 1º nodo de la lista enlazada.
  7. Primero apuntamos el segundo puntero al nodo principal de la lista enlazada, y retrocedemos sincrónicamente con el segundo puntero y el primer puntero.Cuando el primer puntero apunta al nodo vacío al final de la lista enlazada, devolvemos el punto apuntado por el segundo puntero en este momento se puede utilizar el nodo.

3. Código de CA:

Idea uno:

    class Solution {
        public ListNode getKthFromEnd(ListNode head, int k) {
            int n = 0;
            ListNode resultNode = null;
            for (resultNode = head; resultNode != null; resultNode = resultNode.next) {
                n++;
            }
            for (resultNode = head; n > k; n--) {
                resultNode = resultNode.next;
            }
            return resultNode;
        }
    }
复制代码

Idea dos:


    class Solution {
        public ListNode getKthFromEnd(ListNode head, int k) {
            ListNode firstPointer = head;
            ListNode secondPointer = head;
            while (firstPointer != null && k > 0) {
                firstPointer = firstPointer.next;
                k--;
            }
            while (firstPointer != null) {
                firstPointer = firstPointer.next;
                secondPointer = secondPointer.next;
            }
            return secondPointer;
        }
    }
复制代码

Supongo que te gusta

Origin juejin.im/post/7078974302724292645
Recomendado
Clasificación