(Java se refiere a la oferta) El nodo de entrada del anillo en la lista vinculada

1. Análisis de preguntas

Para una lista vinculada, si contiene un anillo, busque el nodo de entrada del anillo de la lista vinculada; de lo contrario, la salida es nula.

La configuración de los punteros rápidos y lentos comienza desde la lista vinculada. El puntero rápido se mueve dos pasos a la vez y el puntero lento se mueve un paso a la vez. Si hay un anillo, se encontrará en un punto determinado del anillo.

Conclusión 1: Los dos punteros continúan desde la cabecera de la lista enlazada y el punto de encuentro, y cada vez que dan un paso, deben encontrarse y la entrada del anillo al final.
Conclusión de la prueba 1: establezca los indicadores rápido y lento rápido y bajo, rápido da dos pasos cada vez y bajo da un paso cada vez. Si hay un anillo, los dos definitivamente se encontrarán (porque una vez que lo bajo entra en el anillo, puede verse como un proceso en el que lo rápido alcanza a lo bajo. Cada vez que los dos están cerca de un paso, definitivamente lo alcanzarán).

Luego, deje que los dos punteros comiencen desde el punto de encuentro y el encabezado de la lista enlazada respectivamente, y ambos se cambian para dar un paso a la vez, y finalmente se encuentran en la entrada del anillo.

Conclusión 2: Los dos indicadores comienzan desde el punto de encuentro y el encabezado de la lista enlazada respectivamente, y ambos se cambian para dar un paso a la vez y finalmente se encuentran en la
entrada del anillo. La longitud desde el encabezado de la lista enlazada hasta la entrada del anillo es: la longitud desde la
entrada del anillo hasta el punto de encuentro es: b
punto de encuentro Longitud hasta la entrada del anillo: c
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Segundo, el código

/**
 * @Auther: Yolo
 * @Date: 2020/9/14 08:56
 * @Description:
 */


public class Test_13 {
    
    
    public static void main(String[] args) {
    
    
        ListNode node1 = new ListNode(1);
        ListNode node2 = new ListNode(2);
        ListNode node3 = new ListNode(3);
        ListNode node4 = new ListNode(4);
        ListNode node5 = new ListNode(5);
        node1.next = node2;
        node2.next = node3;
        node3.next = node4;
        node4.next = node5;
        node5.next = node3;
        ListNode node = EntryNodeOfLoop(node1);
        System.out.println(node.val);
    }

    private static ListNode EntryNodeOfLoop(ListNode pHead) {
    
    
        ListNode fastNode=pHead;
        ListNode lowNode=pHead;
        //找到相遇点
        while (fastNode != null && fastNode.next != null) {
    
    
            fastNode=fastNode.next.next;
            lowNode=lowNode.next;
            if (fastNode == lowNode) {
    
    
                break;
            }
        }
        if (fastNode == null || fastNode.next == null) {
    
    
            return null;
        }
        //将慢节点重置为从头结点出发
        lowNode=pHead;
        //查找环入口结点
        while (fastNode!=lowNode){
    
    
            fastNode=fastNode.next;
            lowNode=lowNode.next;
        }
        return lowNode;
    }
}

Tres, resumen

Este problema no es una rutina simple para formar un anillo desde el nodo inicial, pero se puede formar un anillo a partir de un nodo.

Supongo que te gusta

Origin blog.csdn.net/nanhuaibeian/article/details/108573480
Recomendado
Clasificación