Heim Backend-Entwicklung C#.Net-Tutorial Codeanalyse für .NET Framework – doppelt verknüpfte Liste (LinkedList) (Abbildung)

Codeanalyse für .NET Framework – doppelt verknüpfte Liste (LinkedList) (Abbildung)

Mar 18, 2017 am 11:37 AM



.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:


Codeanalyse für .NET Framework – doppelt verknüpfte Liste (LinkedList) (Abbildung)

1 Die von LinkedList implementierte Schnittstelle:

public class LinkedList<T> : ICollection<T>, ICollection, IReadOnlyCollection<T>, ISerializable, IDeserializationCallback
Nach dem Login kopieren

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";
Nach dem Login kopieren

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; }
}
Nach dem Login kopieren

3 Strukturfunktion :

        public LinkedList() //默认的构造函数
        {
        }        //带有参数的
        public LinkedList(IEnumerable<T> collection)
        {            if (collection == null)
            {                throw new ArgumentNullException(nameof(collection));
            }            foreach (T item in collection)
            {
                AddLast(item);
            }
        }
Nach dem Login kopieren

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看
        }
Nach dem Login kopieren

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);
            }
        }
Nach dem Login kopieren

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);
            }
        }
Nach dem Login kopieren

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++;
        }
Nach dem Login kopieren

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++;
        }
Nach dem Login kopieren

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;
        }
Nach dem Login kopieren

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++;
        }
Nach dem Login kopieren

Die Implementierung ist sehr einfach 🎜>

7 Um die Existenz eines Knotenwerts als Wert zu ermitteln, rufen Sie

Methode suchen
        internal void Invalidate()
        {
            list = null;
            next = null;
            prev = null;
        }
Nach dem Login kopieren
,

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;
        }
Nach dem Login kopieren

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
        }
Nach dem Login kopieren

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!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

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

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Verwenden Sie die Methode „removeLast()' der Klasse „LinkedList', um das letzte Element in der verknüpften Liste zu löschen Verwenden Sie die Methode „removeLast()' der Klasse „LinkedList', um das letzte Element in der verknüpften Liste zu löschen Jul 24, 2023 pm 05:13 PM

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

Java-Programm zum Hinzufügen von Elementen zu LinkedList Java-Programm zum Hinzufügen von Elementen zu LinkedList Aug 26, 2023 pm 10:21 PM

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

Kehren Sie die Gruppierung doppelt verknüpfter Listen nach gegebener Größe mit C++ um Kehren Sie die Gruppierung doppelt verknüpfter Listen nach gegebener Größe mit C++ um Sep 04, 2023 am 09:49 AM

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&

Wie verwende ich die Methode LinkedList.addFirst(), um Elemente zum Kopf einer verknüpften Liste in Java hinzuzufügen? Wie verwende ich die Methode LinkedList.addFirst(), um Elemente zum Kopf einer verknüpften Liste in Java hinzuzufügen? Nov 18, 2023 pm 03:51 PM

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 Interpretation der Java-Dokumentation: Funktionsanalyse der addFirst()-Methode der LinkedList-Klasse Nov 03, 2023 am 09:09 AM

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 Interpretation der Java-Dokumentation: Funktionsanalyse der addLast()-Methode der LinkedList-Klasse Nov 03, 2023 pm 02:26 PM

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

Wie konvertiert man LinkedList in Java in ein Array? Wie konvertiert man LinkedList in Java in ein Array? Aug 29, 2023 pm 11:09 PM

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

.NET Deep Dive: Beherrschen der asynchronen Programmierung, Linq und EF Core .NET Deep Dive: Beherrschen der asynchronen Programmierung, Linq und EF Core Mar 31, 2025 pm 04:07 PM

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.

See all articles