[Estructura de datos] que puede llevarlo al rey Parte 5: Preguntas de prueba de superficie de cadena

contenido

Prefacio:

Descripción del problema:

análisis del problema:

Explicación del problema:

Código:


Prefacio:

¡Hermanos, tengan un hígado todos los días y siéntanse renovados! ! ! ! !

1. Encadene preguntas de prueba de superficie para determinar si la lista enlazada es un palíndromo.

Descripción del problema:

Hermanos, miren la imagen para entender qué es el palíndromo de una lista enlazada:

Estructura palindrómica: leer 12 -> 23 -> 34 adelante, leer 12 -> 23 -> 34 atrás

Los números pares e impares están bien:

análisis del problema:

Para juzgar si es una estructura de palíndromo, entonces tenemos que recorrer la lista enlazada, una de adelante hacia atrás, la otra de atrás hacia adelante, los valores de val correspondientes deben ser los mismos, luego debemos modificar el puntero de la lista enlazada, aquí usaremos la velocidad El puntero nos ayuda a encontrar el nodo medio, cambiar el puntero del nodo medio y comenzar a atravesar después de que se complete el cambio.

Explicación del problema:

Paso 1: para asegurarse de que siempre se pueda encontrar nuestra lista vinculada, defina una variable principal que siempre apunte al nodo principal.

Paso 2: Defina dos variables, las cuales apuntan a la cabeza al principio, y encuentre el nodo intermedio por medio del puntero rápido y lento.

El tercer paso: defina una variable cur para apuntar al siguiente nodo del nodo intermedio, y deje que la variable cur modifique el puntero.

Paso 4: defina una variable curNext igual a cur.Next para evitar que se encuentren los nodos posteriores después de cambiar el puntero.

Código:

  public boolean chkPalindrome(ListNode head) {
        if(head == null) return false;//判断一下链表是不是空,空的话直接返回false
        ListNode fast = head;//快指针fast,初始等于head
        ListNode slow = head;//慢指针slow,初始等于head
        while(fast != null && fast.next != null){//如果链表是奇数,fast.next == null停下,如果链表是偶数fast == null停下
            fast = fast.next.next;//fast走两步
            slow = slow.next;//slow走一步
 
        }
        ListNode cur = slow.next;//cur等于slow的下一个节点
        while(cur != null){//cur不为空开始反转
            ListNode curNext = cur.next;//curNext等于cur的下一个节点
            cur.next = slow;//开始反转
            slow = cur;//反转完了后让slow等于cur
            cur = curNext;//cur再往后走一步。
        }
        while(head != slow){//判断是不是回文结构
            if(head.val != slow.val){//不是回文结构
                return false;
            }
            if(head.next == slow){//偶数链表的情况
                return true;
            }
            head = head.next;
            slow = slow.next;
        }
        return true;
        
        
        
        
        
        
       
    }

En segundo lugar, las preguntas de prueba de la superficie de la cadena, ingresan dos listas vinculadas, encuentran su primer nodo común.

Descripción del problema:

análisis del problema:

juez:

1. Si dos listas enlazadas se cruzan, ¿tiene forma de Y o de X? Y

2. Si dos listas enlazadas se cruzan, ¿el campo de valor de valor es el mismo o el siguiente campo es el mismo?

La figura anterior es la lista enlazada que se cruza. 

Explicación del problema:

Paso 1: primero defina dos variables de byte que apunten a los encabezados de las dos listas vinculadas, encabezadoA y encabezadoB.

Paso 2: Defina dos variables para encontrar la diferencia entre las dos listas enlazadas.

Paso 3: defina dos variables de byte más ps y pl para apuntar a headA y headB respectivamente.

Paso 4: Deje que la larga lista enlazada tome sus pasos de diferencia primero.

Paso 5: Las dos listas enlazadas van juntas.

Paso 6: Cuando ps=pl, es un nodo común.

Código:

 public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        if(headB == null || headA == null) return null;//判断其中一条链表的头节点为空就是没有焦点
        ListNode ps = headA;
        ListNode pl = headB;
        int lenA = 0;
        int lenB = 0;
        while(ps != null){求出ps链表的长度
            lenA++;
            ps = ps.next;
        }
        ps = headA;//让ps重新等于头节点
        while(pl != null){求出pl链表的长度
            lenB++;
            pl = pl.next;
        }
        pl = headB;//让pl重新等于头节点
        int len = lenA - lenB;
        if(len < 0){//判断ps长还是pl长
            ps = headB;
            pl = headA;
            len = lenB - lenA;
        }
         while(len != 0)//求两条链表的差值
                ps = ps.next;
                len--;

            }
        while(ps != pl){
            
            ps = ps.next;
            pl = pl.next;
        }
        return ps;



    }

Registro diario: actualmente, estamos actualizando las preguntas de la lista vinculada. Si está interesado en esta pregunta, puede contactarme en privado. Podemos discutir y trabajar duro juntos.

Supongo que te gusta

Origin blog.csdn.net/m0_64397675/article/details/123530955
Recomendado
Clasificación