[Problem mit verknüpften Listen] So kehren Sie eine einzeln verknüpfte Liste elegant um

Vorwort

Aktualisieren Sie die Putzbeiträge in Form von speziellen Themen. Willkommen, um das Putzen mit mir zu lernen. Glauben Sie mir, Ihre Beharrlichkeit wird definitiv unerwartete Gewinne bringen. Jede Frage bietet eine einfache Antwort. Wenn Sie einen eleganteren Ansatz haben, können Sie gerne eine Anleitung geben. Vielen Dank

[Themenbeschreibung]

Einfach verknüpfte Liste umkehren. Die verknüpfte Liste lautet beispielsweise:

1-> 2-> 3-> 4

Nach der Inversion

4-> 3-> 2-> 1

【Anspruch】

Wenn die Länge der verknüpften Liste N ist, erreicht die Zeitkomplexität O (N) und die zusätzliche Raumkomplexität erreicht O (1).

【Schwierigkeit】

Taxi: ★ ☆☆☆

【Antworten】

Methode 1

Diese Frage ist ganz einfach: Wenn wir einen Knoten umkehren, ändern Sie einfach das hintere Laufwerk eines Knotens, um auf seinen Vorgänger zu zeigen. Der hier zu beachtende Punkt ist, dass, wenn Sie die Rückseite des aktuellen Knotens nach vorne zeigen, die verknüpfte Liste zu diesem Zeitpunkt abgeschnitten wird, dh der hintere Knoten ist vom aktuellen Knoten getrennt, sodass wir eine Variable benötigen, um die Rückseite des aktuellen Knotens zu speichern Fahren, Besuch verloren.

Der spezifische Code lautet wie folgt:

Code wie unten anzeigen

1//节点
2class Node{
3    public int value;
4    public Node next;
5    public Node(int data) {
6        this.value = data;
7    }
8}

Haupt code

1 //
Einfach verknüpfte Liste umkehren 2 öffentlicher statischer Knoten reverseList (Knotenkopf) {
3 Knoten next = null; // Zeigen Sie auf die Rückseite des aktuellen Knotens
4 Knoten pre = null; // Zeigen Sie auf den Vorgänger des aktuellen Knotens
5 while (head! = Null) ) {
6 next = head.next;
7 // Das hintere Laufwerk des aktuellen Knotens zeigt auf den Vorgänger
8 head.next = pre;
9 pre = head;
10 // Den nächsten Knoten verarbeiten
11 head = next;
12}
13 return pre;

Methode Zwei

Dieses Problem kann auch mit einer Rekursion gelöst werden, vorausgesetzt, die Funktion der reverse () -Methode besteht darin, die einfach verknüpfte Liste umzukehren. Bei Verwendung der rekursiven Methode können wir die untergeordnete verknüpfte Liste weiterhin rekursieren. Zum Beispiel für die folgende verknüpfte Liste:

[Problem mit verknüpften Listen] So kehren Sie eine einzeln verknüpfte Liste elegant um
Wir wiederholen die untergeordnete verknüpfte Liste 2-> 3-> 4,
dh Node newList = reverse (head.next). Das Ergebnis nach der Rekursion lautet wie folgt:
[Problem mit verknüpften Listen] So kehren Sie eine einzeln verknüpfte Liste elegant um

Nach der Umkehrung wird die untergeordnete Liste 2-> 3-> zu 4-> 3-> 2.
Beachten Sie, dass ich gerade angenommen habe, dass die Funktion von reverse () darin besteht, die verknüpfte Liste umzukehren. Zu diesem Zeitpunkt zeigt Knoten 1 jedoch immer noch auf Knoten 2. Zu diesem Zeitpunkt kehren wir die Knoten 1 und 2 erneut um, und dann zeigt der nächste Knoten von 1 auf Null. Wie gezeigt:
[Problem mit verknüpften Listen] So kehren Sie eine einzeln verknüpfte Liste elegant um

Die Endbedingung der Rekursion lautet: Wenn die untergeordnete verknüpfte Liste nur einen Knoten hat oder null ist, endet die Rekursion. Code wie folgt anzeigen:

 1    //用递归的方法反转链表
 2    public static Node reverseList2(Node head){
 3        if (head == null || head.next == null) {
 4            return head;
 5        }
 6        //递归反转子lian链表
 7        Node newList = reverseList2(head.next);
 8        //第三张图
 9        head.next.next = head;
10        head.next = null;
11        return newList;
12    }

Problemerweiterung

Thema: Teil des verknüpften Listenknotens umkehren

[Themenbeschreibung]

Thema: Wenn der Kopfknotenkopf einer einfach verknüpften Liste und zwei Ganzzahlen von und nach angegeben sind, kehren Sie den Von-Knoten und den Knoten in der Einzelkettenliste um

列 如 :
1-> 2-> 3-> 4-> 5-> null, von = 2 bis = 4

Ergebnis: 1-> 4-> 3-> 2-> 5-> null

Aufgelistet als:

1-> 2-> 3-> null von = 1 bis = 3

Das Ergebnis ist 3-> 2-> 1-> null

【Anspruch】

1. Wenn die Länge der verknüpften Liste N ist, ist die Zeitkomplexitätsanforderung O (N) und die zusätzliche Raumkomplexitätsanforderung ist O (1).

2. Wenn 1 <= von <= bis <= N nicht erfüllt ist, erfolgt keine Anpassung

【Schwierigkeit】

Taxi: ★ ☆☆☆

【Antworten】

Sie können es selbst tun oder darüber nachdenken. Wenn Sie die Antwort erhalten möchten, können Sie auf Antwort 2 auf dem offiziellen Konto antworten, um den Code zu erhalten

  • Ende -

    Vergangenheit

[Problem mit verknüpfter Liste] Löschen Sie den Zwischenknoten einer einfach verknüpften Liste

[Problem mit verknüpfter Liste] Löschen Sie den K-ten Knoten in der einfach verknüpften Liste

[Algorithmuskampf] Generiert ein Array von Fenstermaximalwerten

[Problem mit verknüpften Listen] So kehren Sie eine einzeln verknüpfte Liste elegant um

Ich denke du magst

Origin blog.51cto.com/15015171/2555346
Empfohlen
Rangfolge