


Codeanalyse für .NET Framework – doppelt verknüpfte Liste (LinkedList) (Abbildung)
.NETLinkList im Framework implementiert eine doppelt verknüpfte Liste. Fassen wir den Implementierungsquellcode zusammen.
Schauen Sie sich zunächst die von LinkedList bereitgestellte Karte der öffentlichen Eigenschaften und Methoden an:

1 Die von LinkedList implementierte Schnittstelle:
public class LinkedList<T> : ICollection<T>, ICollection, IReadOnlyCollection<T>, ISerializable, IDeserializationCallback
2 Die globale -Variable von LinkedList enthält
Kopf ist der Hauptknoten in der gekapselten Klasse; die Datenstruktur jedes von
// This LinkedList is a doubly-Linked circular list. internal LinkedListNode<T> head; internal int count; internal int version; private object _syncRoot; //A temporary variable which we need during deserialization. private SerializationInfo _siInfo; // names for serialization private const string VersionName = "Version"; private const string CountName = "Count"; private const string ValuesName = "Data";
gekapselten Knotens ist:
public sealed class LinkedListNode<T> { public LinkedListNode(T value); //获取LinkedListNode所属的LinkedList public LinkedList<T> List { get; } public LinkedListNode<T> Next { get; } public LinkedListNode<T> Previous { get; } //获取节点中包含的值。 public T Value { get; set; } }
3 Strukturfunktion :
public LinkedList() //默认的构造函数 { } //带有参数的 public LinkedList(IEnumerable<T> collection) { if (collection == null) { throw new ArgumentNullException(nameof(collection)); } foreach (T item in collection) { AddLast(item); } }
Beim Erstellen einer Sammlung vom Typ IEnumerable wird die AddLast(T)-Methode verwendet. Sie verfügt auch über eine -Überladung wie folgt:
public LinkedListNode<T> AddLast(T value) { LinkedListNode<T> result = new LinkedListNode<T>(this, value); if (head == null) { InternalInsertNodeToEmptyList(result); } else { InternalInsertNodeBefore(head, result); } return result; } public void AddLast(LinkedListNode<T> node) { ValidateNewNode(node); if (head == null) { InternalInsertNodeToEmptyList(node); } else { InternalInsertNodeBefore(head, node); } node.list = this; //结合LinkedListNode看 }
Die Semantik der beiden oben genannten Methoden besteht darin, einen Knoten einzufügen.
Einen neuen Knoten in eine leere Liste einfügen. InternalInsertNodeToEmptyList
Einen neuen Knoten in eine nicht leere Liste einfügen list, InternalInsertNodeBefore und geben Sie „NewNode vor welchem Knoten einfügen“ an und bestimmen Sie außerdem, ob der neu eingefügte Knoten ein gültiger neuer Knoten ist.
internal void ValidateNewNode(LinkedListNode<T> node) { if (node == null) { throw new ArgumentNullException(nameof(node)); } if (node.list != null) { throw new InvalidOperationException(SR.LinkedListNodeIsAttached); } }
Gleichzeitig bietet es auch eine Möglichkeit zu bestimmen, ob ein Knoten ein gültiger Knoten ist:
internal void ValidateNode(LinkedListNode<T> node) { if (node == null) { throw new ArgumentNullException(nameof(node)); } if (node.list != this) { throw new InvalidOperationException(SR.ExternalLinkedListNode); } }
Dies ist eine wichtige interne Methode einer doppelt verknüpften Liste.
Details zur Implementierung von InternalInsertNodeToEmptyList:
private void InternalInsertNodeToEmptyList(LinkedListNode<T> newNode) { Debug.Assert(head == null && count == 0, "LinkedList must be empty when this method is called!"); newNode.next = newNode; newNode.prev = newNode; head = newNode; version++; count++; }
Details zur Implementierung von InternalInsertNodeBefore:
private void InternalInsertNodeBefore(LinkedListNode<T> node, LinkedListNode<T> newNode) { newNode.next = node; newNode.prev = node.prev; node.prev.next = newNode; node.prev = newNode; version++; count++; }
4 Natürlich sind verknüpfte Listen untrennbar mit der öffentlichen Methode zum Einfügen eines Knotens verbunden ,
public LinkedListNode<T> AddAfter(LinkedListNode<T> node, T value) { ValidateNode(node); LinkedListNode<T> result = new LinkedListNode<T>(node.list, value); InternalInsertNodeBefore(node.next, result); return result; } public void AddAfter(LinkedListNode<T> node, LinkedListNode<T> newNode) { ValidateNode(node); ValidateNewNode(newNode); InternalInsertNodeBefore(node.next, newNode); newNode.list = this; } public LinkedListNode<T> AddBefore(LinkedListNode<T> node, T value) { ValidateNode(node); LinkedListNode<T> result = new LinkedListNode<T>(node.list, value); InternalInsertNodeBefore(node, result); if (node == head) { head = result; } return result; } public void AddBefore(LinkedListNode<T> node, LinkedListNode<T> newNode) { ValidateNode(node); ValidateNewNode(newNode); InternalInsertNodeBefore(node, newNode); newNode.list = this; if (node == head) { head = newNode; } } public LinkedListNode<T> AddFirst(T value) { LinkedListNode<T> result = new LinkedListNode<T>(this, value); if (head == null) { InternalInsertNodeToEmptyList(result); } else { InternalInsertNodeBefore(head, result); head = result; } return result; } public void AddFirst(LinkedListNode<T> node) { ValidateNewNode(node); if (head == null) { InternalInsertNodeToEmptyList(node); } else { InternalInsertNodeBefore(head, node); head = node; } node.list = this; } public LinkedListNode<T> AddLast(T value) { LinkedListNode<T> result = new LinkedListNode<T>(this, value); if (head == null) { InternalInsertNodeToEmptyList(result); } else { InternalInsertNodeBefore(head, result); } return result; } public void AddLast(LinkedListNode<T> node) { ValidateNewNode(node); if (head == null) { InternalInsertNodeToEmptyList(node); } else { InternalInsertNodeBefore(head, node); } node.list = this; }
5 Dann werfen Sie einen Blick darauf, löschen Sie alle Knoten in der verknüpften Liste. Hier werden alle Knoten so eingestellt, dass sie nicht auf den Speicherheap verweisen, und dann auf das GC-Recycling warten >
6 entspricht dem Entfernen einer Reihe von Schnittstellen eines bestimmten Knotens. Ich werde nicht auf Details eingehen.public void Clear() { LinkedListNode<T> current = head; while (current != null) { LinkedListNode<T> temp = current; current = current.Next; // use Next the instead of "next", otherwise it will loop forever temp.Invalidate(); } head = null; count = 0; version++; }
Die Implementierung ist sehr einfach 🎜>
7 Um die Existenz eines Knotenwerts als Wert zu ermitteln, rufen Sie
Methode sucheninternal void Invalidate() { list = null; next = null; prev = null; }
Methodenimplementierungsdetails suchen, ähnlich
API< auf 🎜> und FindLast, da es sich um eine doppelt verknüpfte Liste handelt. Beginnen Sie also einfach mit dem Durchlaufen der verknüpften Liste am Ende,public bool Contains(T value) { return Find(value) != null; }
8 Schauen wir uns eine andere Implementierung des Kopierens von Daten in das Array
an :public LinkedListNode<T> Find(T value) { LinkedListNode<T> node = head; //调用默认相等比较器 EqualityComparer<T> c = EqualityComparer<T>.Default; if (node != null)//链表为null { if (value != null) { do { if (c.Equals(node.item, value)) //Equals:某个节点node的item与value相等 { return node; } node = node.next; } while (node != head); } else { do { if (node.item == null) { return node; } node = node.next; } while (node != head); } } return null; //链表为null,直接返回null }
Das obige ist der detaillierte Inhalt vonCodeanalyse für .NET Framework – doppelt verknüpfte Liste (LinkedList) (Abbildung). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Verwenden Sie die Methode „removeLast()“ der Klasse „LinkedList“, um das letzte Element in der verknüpften Liste zu löschen. LinkedList ist eine allgemeine Datenstruktur im Java-Sammlungsframework. Sie speichert Elemente in Form einer doppelt verknüpften Liste. Mithilfe der von der LinkedList-Klasse bereitgestellten Methoden können wir die verknüpfte Liste problemlos bearbeiten, z. B. Elemente hinzufügen, löschen und ändern. In einigen Szenarien müssen wir möglicherweise das letzte Element in der verknüpften Liste löschen. Die LinkedList-Klasse stellt „removeLas“ bereit

LinkedList ist eine allgemeine Klasse von JavaCollectionFramework, die drei Schnittstellen implementiert: List, Deque und Queue. Es bietet die Funktionalität der LinkedList-Datenstruktur, einer linearen Datenstruktur, in der jedes Element miteinander verknüpft ist. Wir können eine Vielzahl von Vorgängen für eine LinkedList ausführen, einschließlich des Hinzufügens, Entfernens und Durchlaufens von Elementen. Um Elemente zur LinkedList-Sammlung hinzuzufügen, können wir verschiedene integrierte Methoden wie add(), addFirst() und addLast() verwenden. Wir werden untersuchen, wie Sie diese Methoden verwenden, um Elemente zu einer LinkedList hinzuzufügen. in Java

In diesem Problem erhalten wir einen Zeiger auf den Kopf der verknüpften Liste und eine ganze Zahl k. In einer Gruppe der Größe k müssen wir die verknüpfte Liste umkehren. Zum Beispiel -Input:1<->2<->3<->4<->5(doublylinkedlist),k=3Output:3<->2<->1<->5<->4 sucht nach Lösungen Methode In diesem Problem werden wir einen rekursiven Algorithmus formulieren, um dieses Problem zu lösen. Bei dieser Methode verwenden wir die Rekursion und lösen das Problem mithilfe der Rekursion. Beispiel#include<iostream&

Die LinkedList-Klasse in Java stellt die Methode addFirst() bereit, um Elemente zum Kopf der verknüpften Liste hinzuzufügen. Die Funktion dieser Methode besteht darin, ein Element am Anfang der verknüpften Liste hinzuzufügen und andere Elemente der ursprünglichen verknüpften Liste nach hinten zu verschieben. Im Folgenden finden Sie Beispielcode, der die Methode LinkedList.addFirst() verwendet, um Elemente zum Kopf einer verknüpften Liste hinzuzufügen: importjava.util.LinkedList;publicclassMain{pu

Interpretation der Java-Dokumentation: Funktionsanalyse der addFirst()-Methode der LinkedList-Klasse. LinkedList ist eine doppelt verknüpfte Listenimplementierungsklasse im Java-Sammlungsframework. Sie bietet eine Reihe von Methoden zum Hinzufügen, Löschen und Suchen in der Liste. Unter diesen ist die Methode addFirst() eine der wichtigsten Methoden in der LinkedList-Klasse. Dieser Artikel bietet eine detaillierte Analyse der Funktionen der addFirst()-Methode mit spezifischen Codebeispielen. addFirst()-Methode

Interpretation der Java-Dokumentation: Funktionsanalyse der addLast()-Methode der LinkedList-Klasse Im Java-Collection-Framework ist die LinkedList-Klasse eine Listenschnittstelle, die durch eine doppelt verknüpfte Liste implementiert wird. Die LinkedList-Klasse bietet viele Methoden zum Betreiben verknüpfter Listen, einschließlich der Methode addLast(). Dieser Artikel bietet eine detaillierte Analyse der addLast()-Methode von LinkedList und stellt spezifische Codebeispiele bereit. Die Funktion der Methode addLast() besteht darin, das angegebene Element hinzuzufügen

Die toArray()-Methode der LinkedList-Klasse konvertiert das aktuelle LinkedList-Objekt in ein Array vom Objekttyp und gibt es zurück. Dieses Array enthält alle Elemente dieser Liste in der richtigen Reihenfolge (vom ersten bis zum letzten Element). Es fungiert als Brücke zwischen Array-basierten und Sammlungs-basierten APIs. Konvertieren Sie also LinkedList in ein Array und instanziieren Sie die LinkedList-Klasse. Füllen Sie es mit der Methode add(). Rufen Sie die Methode toArray() für die oben erstellte verknüpfte Liste auf und rufen Sie das Array von Objekten ab. Konvertiert jedes Element eines Arrays von Objekten in eine Zeichenfolge. Beispiel Echtzeitdemonstration von importjava.util.Arrays;importjava.uti

Die Kernkonzepte von .NET -Asynchronprogrammierung, Linq und EFCORE sind: 1. Asynchrones Programmieren verbessert die Reaktionsfähigkeit der Anwendungen durch Async und wartet; 2. LINQ vereinfacht die Datenabfrage durch Unified Syntax; 3.. EFCORE vereinfacht Datenbankvorgänge durch ORM.
