Comic: ¿Cómo encontrar el n-ésimo nodo de la parte inferior de la lista vinculada?

Comunidad de combate de Python

Comunidad de combate de Java

Mantenga presionado para identificar el código QR a continuación, agregue según sea necesario

Escanee el código QR a seguir para agregar servicio al cliente

Ingrese a la comunidad de Python ▲

Escanee el código QR a seguir para agregar servicio al cliente

Ingrese a la comunidad Java

Autor 丨 Xiao Hui

Fuente 丨 Programador Xiaohui (ID: chengxuyuanxiaohui)


----- el día siguiente -----

Qué significa eso? Tomemos la siguiente lista enlazada como ejemplo:

Dado el nodo principal de la lista vinculada, pero no conocemos la longitud real de la lista vinculada, debemos encontrar el n-ésimo nodo desde la parte inferior de la lista vinculada.

Suponiendo que n = 3, entonces el nodo a encontrar es el elemento 1:

¿Cómo usar la cola? Las ideas de Xiao Hui son las siguientes:

1. Cree una cola de longitud n, recorra la lista vinculada original y deje que los nodos ingresen a la cola uno por uno:

2. Cuando la cola esté llena, deje que el elemento de cola salga de la cola y el nuevo nodo ingresará a la cola:

3. Cuando se atraviesan todos los nodos de la lista vinculada, el elemento al final de la cola es el n-ésimo nodo desde la parte inferior (porque la longitud de la cola es n):

————————————

Primero, creamos dos punteros P1 y P2, P1 apunta al nodo principal de la lista vinculada y P2 apunta al n-ésimo nodo positivo de la lista vinculada (es decir, el tercer nodo en el ejemplo):

A continuación, dejamos que los punteros P1 y P2 se muevan hacia la derecha al mismo tiempo, un paso a la vez, hasta que el puntero P2 se mueva al final de la lista vinculada:

En este momento, dado que P2 apunta al nodo final de la lista vinculada, y la distancia entre P1 y P2 es n-1, el nodo al que apunta P1 es el n-ésimo nodo desde la parte inferior de la lista vinculada que estamos buscando:

Obviamente, este método solo necesita recorrer la lista enlazada una vez de principio a fin, y solo usa dos punteros La complejidad espacial del algoritmo es O (1).

public class NthFromEnd {
    public static Node findNthFromEnd(Node head, int n){
        Node p1 = head;
        Node p2 = head;
        //把p2指针移动到正数第n个结点
        for(int i=1; i<n; i++){
            p2 = p2.next;
            if(p2 == null){
                throw new IllegalArgumentException("参数n超出链表长度!");
            }
        }
        //p1和p2一起右移,直到p2指向链表尾结点
        while (p2.next != null){
            p1 = p1.next;
            p2 = p2.next;
        }
        return p1;
    }

    //快速创建链表
    private static Node buildLinkList(int[] array){
        Node head = new Node(array[0]);
        Node p = head;
        for(int i=1; i<array.length; i++){
            p.next = new Node(array[i]);
            p = p.next;
        }
        return head;
    }

    //链表节点
    private static class Node {
        int data;
        Node next;

        Node(int data) {
            this.data = data;
        }
    }

    public static void main(String[] args) {
        int[] inputs = {5,3,7,2,4,1,9,8};
        Node head = buildLinkList(inputs);
        Node node = findNthFromEnd(head,3);
        System.out.println("链表倒数第3个元素是:" + node.data);
    }

}


-----FIN-----

程序员专栏 扫码关注填加客服 长按识别下方二维码进群

Contenido emocionante reciente recomendado:  

 955. Se agregan 6 nuevas empresas a la lista de empresas que no realizan horas extraordinarias de WLB

 ¡Las últimas estadísticas de salarios de programadores en octubre de 2020!

 El entrevistador me preguntó cuántas formas de crear hilos. me reí

 Uso de la biblioteca itchat de Python


Mira el buen artículo aquí para compartirlo con más personas ↓↓

Supongo que te gusta

Origin blog.csdn.net/Px01Ih8/article/details/109323752
Recomendado
Clasificación