Obtenez facilement les questions de test de surface de la chaîne

Préface

Conditions aux limites pour vérifier si le code de la liste liée est correct:

  1. Si la liste liée est nulle, le code s'exécute-t-il normalement?
  2. Si la liste liée n'a qu'un seul nœud, le code s'exécute-t-il normalement?
  3. Si la liste liée n'a que deux nœuds, le code s'exécute-t-il normalement?
  4. Lorsque la logique de code traite le nœud principal et le nœud final, le code s'exécute-t-il normalement?

La structure et l'impression de la liste chaînée

  public static void main(String[] args) {
    
    
        int[] arr = {
    
    1, 3, 5, 7, 9, 11, 13, 15, 17};
        LinkedListDemo linkedListDemo = new LinkedListDemo();
        Node head1 = linkedListDemo.buildLinkedList(arr);
        linkedListDemo.display(head1);
        // 链表逆序
        linkedListDemo.display(linkedListDemo.reverseList(head1));
        linkedListDemo.display(head1);
    }

    private static class Node {
    
    
        final Integer item;
        Node next;

        Node(Integer item, Node next) {
    
    
            this.item = item;
            this.next = next;
        }
    }
    
    /**
     * 打印链表
     *
     * @param header
     */
    public void display(Node header) {
    
    
        Node p = header;
        while (p != null) {
    
    
            System.out.print(p.item + " ");
            p = p.next;
        }
        System.out.println();
    }

    /**
     * 通过数组构造一个链表
     *
     * @param arr
     * @return
     */
    public Node buildLinkedList(int[] arr) {
    
    
        if (Objects.isNull(arr) || arr.length < 1) {
    
    
            throw new IllegalArgumentException("illegal arr");
        }
        Node head = new Node(arr[0], null);
        if (arr.length >= 2) {
    
    
            Node p = head;
            for (int i = 1; i < arr.length; i++) {
    
    
                Node temp = new Node(arr[i], null);
                p.next = temp;
                p = temp;
            }
        }
        return head;
    }

    public void checkNull(Node head) {
    
    
        if (head == null) {
    
    
            throw new NullPointerException();
        }
    }

Ordre inverse de la liste liée individuellement

 /**
     * 单链表逆序
     *
     * @param head
     */
    public Node reverseList(Node head) {
    
    
        this.checkNull(head);
        Node p = head.next;
        head.next = null;
        Node temp;
        while (p != null) {
    
    
            temp = p.next;
            p.next = head;
            head = p;
            p = temp;
        }
        return head;
    }

Fusionner deux listes chaînées ordonnées

 /**
     * 合并两个有序链表
     *
     * @param head1
     * @param head2
     * @return
     */
    public Node mergeTwoSortedLinkedList(Node head1, Node head2) {
    
    
        if (head1 == null && head2 == null) {
    
    
            throw new IllegalArgumentException("Illegal params");
        }
        if (head1 == null) {
    
    
            return head2;
        }

        if (head2 == null) {
    
    
            return head1;
        }
        // 设置一个哨兵结点
        Node head = new Node(null, null);
        Node p = head;
        while (head1 != null && head2 != null) {
    
    
            if (head1.item < head2.item) {
    
    
                p.next = head1;
                p = head1;
                head1 = head1.next;
            } else {
    
    
                p.next = head2;
                p = head2;
                head2 = head2.next;
            }
        }

        // 拼接链表的剩下部分
        if (head1 != null) {
    
    
            p.next = head1;
        }

        if (head2 != null) {
    
    
            p.next = head2;
        }

        p = null;
        return head.next;
    }

Supprimer le nième nœud du bas de la liste liée

Déclarez deux pointeurs rapides et lents, laissez le pointeur rapide faire n étapes, puis déplacez les deux pointeurs vers l'arrière en même temps, jusqu'à ce que le pointeur rapide atteigne le dernier nœud, le nœud suivant du pointeur lent est le nœud à supprimer.

  /**
     * 删除链表倒数第 n 个结点
     *
     * @param head
     * @param n
     * @return
     */
    public Node removeNode(Node head, Integer n) {
    
    
        if (head == null) {
    
    
            return null;
        }
        Node slow = head, fast = head;
        // 让快指针先走 n 步
        int i = 0;
        while (fast != null && i < n) {
    
    
            fast = fast.next;
            i++;
        }
        // 如果指定的 n 大于链表的长度,不进行删除处理
        if (n > i) {
    
    
            return head;
        }

        //如果指定的 n 等于链表的长度,删除第一个结点
        if (fast == null) {
    
    
            return head.next;
        }
        // 同时移动两个指针直到快指针指向尾结点
        while (fast.next != null) {
    
    
            slow = slow.next;
            fast = fast.next;
        }
        // 删除 slow.next
        slow.next = slow.next.next;
        return head;
    }

Trouvez le nœud du milieu de la liste liée

Déclarez les pointeurs rapides et lents, les pointeurs lents ne traversent qu'un seul nœud, la vitesse du pointeur rapide est de 2 fois, lorsque le pointeur rapide pointe vers le dernier nœud de la liste liée (le nombre de points de résumé dans la liste liée est impair) ou le pointeur rapide pointe vers l'avant-dernier nœud (le nombre de points de résumé dans la liste liée est Even), le pointeur lent pointe vers le nœud du milieu de la liste liée.

    /**
     * 找出链表的中间结点
     *
     * @param head
     * @return
     */
    public Node getMiddleNode(Node head) {
    
    
        this.checkNull(head);
        Node fast = head, slow = head;
        while (fast != null && fast.next != null && fast.next.next != null) {
    
    
            slow = slow.next;
            fast = fast.next.next;
        }
        return slow;
    }

Détection des sonneries dans les listes chaînées

Référence: détection des anneaux dans la liste chaînée

Je suppose que tu aimes

Origine blog.csdn.net/jiaobuchong/article/details/84675815
conseillé
Classement