【Übung zur Datenstruktur】Sammlung von Fragen zum Kettenoberflächentest 1

Inhaltsverzeichnis

Vorwort:

1. Löschen Sie alle Knoten, deren Wert der Schlüssel in der verknüpften Liste ist

 Methode 1: Normales Löschen, der Kopfknoten wird separat besprochen

Methode 2: Methode des virtuellen Kopfknotens

 Methode 3: Rekursion

2. Umgekehrte verknüpfte Liste

 Methode 1: Doppelzeiger-Iteration

  Methode 2: Rekursive Analyse:

3. Der Zwischenknoten der verknüpften Liste 

 Methode: schnelle und langsame Zeigermethode

4. Der letzte k-te Knoten in der verknüpften Liste

 Methode: schnelle und langsame Zeigermethode

5. Führen Sie zwei geordnete verknüpfte Listen zusammen

Methode: iterieren 


Vorwort:

Wenn Sie die Datenstruktur gut lernen möchten, müssen Sie die Fragen üben. Wir müssen nicht nur mehr Fragen studieren, sondern sie auch gut studieren! Aus diesem Grund habe ich eine Reihe von Must-Do-Fragensammlungen mit jeweils etwa 5 Fragen gestartet. Dies ist der erste Multiple-Choice-Artikel und die Serie wird von Zeit zu Zeit aktualisiert, also bleiben Sie dran!


1. Löschen Sie alle Knoten, deren Wert der Schlüssel in der verknüpften Liste ist

Entfernen Sie verknüpfte Listenelemente https://leetcode.cn/problems/remove-linked-list-elements/

Titel Beschreibung:

Bei einem gegebenen Kopfknoten einer verknüpften Liste  head und einer Ganzzahl  val löschen Sie bitte alle erfüllten  Node.val == val Knoten in der verknüpften Liste und geben Sie  einen neuen Kopfknoten zurück  .

 

 Methode 1: Normales Löschen, der Kopfknoten wird separat besprochen

public ListNode removeElements(ListNode head, int val) {
        while(head!=null&&head.val==val){
            head=head.next;
        }
        if(head==null){
            return head;
        }

        ListNode cur=head;
        while (cur.next!=null){
            if(cur.next.val==val){
                cur.next=cur.next.next;
            }else {
                cur=cur.next;
            }
        }
        return head;
    }

Analysieren:

 aber der Hauptknoten wird fehlen

Methode 2: Methode des virtuellen Kopfknotens

   public ListNode removeElements(ListNode head, int val) {
        if(head==null){
            return head;
        }
        ListNode newnode=new ListNode();
        newnode.next=head;
        head=newnode;
        ListNode cur=head;
        while (cur.next!=null){
            if(cur.next.val==val){
                cur.next=cur.next.next;
            }else {
                cur=cur.next;
            }
        }
        return head.next;

    }

Analysieren:

 Methode 3: Rekursion

class Solution {
    public ListNode removeElements(ListNode head, int val) {
        if (head == null) {
            return head;
        }
        head.next = removeElements(head.next, val);
        return head.val == val ? head.next : head;
    }
}

Vor der rekursiven Methode handelt es sich um einen Prozess zum Schieben des Stapels, nach der rekursiven Methode handelt es sich um einen Prozess zum Öffnen des Stapels


2. Umgekehrte verknüpfte Liste

Umgekehrt verknüpfte Liste https://leetcode.cn/problems/reverse-linked-list/

Titel Beschreibung:

Angesichts des Kopfknotens der einfach verknüpften Liste  head kehren Sie bitte die verknüpfte Liste um und geben Sie die umgekehrte verknüpfte Liste zurück.

 

 

 Methode 1: Doppelzeiger-Iteration

public ListNode reverseList(ListNode head) {
      ListNode pre=null;
      ListNode cur=head;
      while(cur!=null){
          ListNode tmp=cur.next;
          cur.next=pre;
          pre=cur;
          cur=tmp;
      }
      return pre;
    }

Analysieren:

Wir können zwei Zeiger beantragen, der erste Zeiger heißt pre und zeigt zunächst auf null. Der zweite Zeiger „Cur“ zeigt auf den Kopf und durchquert dann kontinuierlich „Cur“. Jedes Mal, wenn es zu cur iteriert, wird das nächste von cur auf pre verwiesen und dann ein Bit auf pre und cur vorgerückt. Nach allen Iterationen (cur wird null) ist pre der letzte Knoten.

  Methode 2: Rekursive Analyse:

 public ListNode reverseList(ListNode head) {
        if(head==null || head.next==null) {
            return head;
        }
        ListNode cur = reverseList(head.next);
        head.next.next = head;
        head.next = null;
        return cur;
    }

 Analysieren:


3. Der Zwischenknoten der verknüpften Liste 

 Der mittlere Knoten der verknüpften Liste https://leetcode.cn/problems/middle-of-the-linked-list/

Titel Beschreibung:

Suchen Sie anhand des Kopfknotens der einfach verknüpften Liste  head den mittleren Knoten der verknüpften Liste und geben Sie ihn zurück. Wenn zwei Zwischenknoten vorhanden sind, geben Sie den zweiten Zwischenknoten zurück.

 

 Methode: schnelle und langsame Zeigermethode

 public ListNode middleNode(ListNode head) {
        if(head==null){
            return null;
        }
        ListNode fast=head;
        ListNode slow=head;
        while(fast!=null&&fast.next!=null){
            fast=fast.next.next;
            slow=slow.next;
        }
        return slow;
    }

 Analysieren:

Verwenden Sie zwei Zeiger,  slow um  fast die verknüpfte Liste gemeinsam zu durchlaufen. slow Machen Sie einen Schritt nach dem anderen, fast zwei Schritte nach dem anderen. Wenn dann  fast das Ende der verknüpften Liste erreicht ist, slow muss sie sich in der Mitte befinden.


4. Der letzte k-te Knoten in der verknüpften Liste

Titel Beschreibung:

Geben Sie eine verknüpfte Liste ein und geben Sie den k-ten letzten Knoten in der verknüpften Liste aus.

 Methode: schnelle und langsame Zeigermethode

  public ListNode FindKthToTail(ListNode head,int k) {
        if(head==null||k<=0){
            return null;
        }
        ListNode slow=head;
        ListNode fast=head;
        while(k-1>0){
            fast=fast.next;
            if(fast==null){
                return null;
            }
            k--;
        }
        while(fast!=null&&fast.next!=null){
            fast=fast.next;
            slow=slow.next;
        }
        return slow;
    }

Analysieren:

Lassen Sie den schnellen Zeiger zuerst zuerst k-1 Schritte gehen, und lassen Sie dann den schnellen und langsamen Zeiger Schritt für Schritt laufen, bis der schnelle Zeiger fast==null&&fast.next==null ist und der langsame Zeiger der K-te Knoten von ist unten.


5. Führen Sie zwei geordnete verknüpfte Listen zusammen

Zwei geordnete verknüpfte Listen zusammenführen https://leetcode.cn/problems/merge-two-sorted-lists/ Titelbeschreibung:

Führt zwei aufsteigende Listen zu einer neuen  aufsteigenden  Liste zusammen und kehrt zurück. Die neue verknüpfte Liste wird durch Zusammenfügen aller Knoten der beiden angegebenen verknüpften Listen gebildet.

 

 

Methode: iterieren 

public ListNode mergeTwoLists(ListNode head1, ListNode head2) {
        if(head1==null){
            return head2;
        }
        if(head2==null){
            return head1;
        }
        ListNode listNode = new ListNode();
        ListNode cur=listNode;
        while(head1!=null&&head2!=null){
            if(head1.val<head2.val){
                cur.next=head1;
                head1=head1.next;
            }else{
                cur.next=head2;
                head2=head2.next;
            }
            cur=cur.next;
        }
        if(head1==null){
            cur.next=head2;
        }else{
            cur.next=head1;
        }
        return listNode.next;
    }

 Analysieren:

Vergleichen Sie die Elemente in head1 und head2. Wer kleiner ist, wird mit cur verbunden. Wenn beispielsweise der Wert von head1 klein ist, verbinden Sie hea1 mit cur und machen Sie dann einen Schritt zurück, um zum neuen head1 zu werden. Cur macht einen Schritt rückwärts, um der neue Cur zu werden, wiederum durch Analogie vergleichen 

 


Das Obige ist mein persönlicher Austausch. Wenn Sie Fragen haben, können Sie diese gerne besprechen! !

Ich habe das gesehen, warum hörst du nicht zu und gibst ein kostenloses „Gefällt mir“. 

 

Ich denke du magst

Origin blog.csdn.net/WHabc2002/article/details/132422102
Empfohlen
Rangfolge