.NET Framework-이중 연결 목록(LinkedList) 코드 분석(그림)
.NET프레임워크의 LinkList는 이중 연결 목록을 구현합니다. 구현 소스 코드를 요약해 보겠습니다.
먼저 LinkedList에서 제공하는 공용 속성 및 메서드 맵을 살펴보세요.

1 LinkedList에 의해 구현된 인터페이스:
public class LinkedList<T> : ICollection<T>, ICollection, IReadOnlyCollection<T>, ISerializable, IDeserializationCallback
2 LinkedList의 전역 변수에는
head가 포함됩니다. 은 캡슐화된 클래스의 헤드 노드입니다.
// 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";
캡슐화된 각 노드의 데이터 구조는 다음과 같습니다.
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 생성자 :
public LinkedList() //默认的构造函数 { } //带有参数的 public LinkedList(IEnumerable<T> collection) { if (collection == null) { throw new ArgumentNullException(nameof(collection)); } foreach (T item in collection) { AddLast(item); } }
는 IEnumerable 유형의 컬렉션을 구성할 때 AddLast(T) 메서드를 사용합니다. 여기에는 오버로드도 포함됩니다.
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看 }
위 내용은 다음과 같습니다. 2가지 방법에서 의미론은 노드를 삽입하는 것입니다.
빈 목록에 새 노드를 삽입하고 InternalInsertNodeToEmptyList
비어 있지 않은 목록인 InternalInsertNodeBefore에 새 노드를 삽입하고 newNode가 삽입되기 전에 노드를 제공합니다. 또한 새로 삽입된 노드는 유효한 새 노드가 아니라고 판단합니다.
internal void ValidateNewNode(LinkedListNode<T> node) { if (node == null) { throw new ArgumentNullException(nameof(node)); } if (node.list != null) { throw new InvalidOperationException(SR.LinkedListNodeIsAttached); } }
동시에 노드가 유효한 노드인지 확인하는 방법도 제공합니다.
internal void ValidateNode(LinkedListNode<T> node) { if (node == null) { throw new ArgumentNullException(nameof(node)); } if (node.list != this) { throw new InvalidOperationException(SR.ExternalLinkedListNode); } }
이것은 이중 연결 목록의 중요한 내부 방법입니다
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++; }
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 연결된 목록은 노드를 삽입하는 공용 메서드
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와 자연스럽게 분리될 수 없습니다. 다시 보면 연결리스트에 있는 모든 노드를 삭제하고, 여기에서는 모든 노드가 메모리 힙을 가리키지 않도록 설정한 다음 GC 재활용을 기다리는 것인데,
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++; }
6에 해당하는 것은 a만 제거하는 것입니다. 추가와 유사하며 자세히 설명하지 않을 특정 노드의 일련의 인터페이스
Clear는 Invalidate()를 호출하고 구현은 매우 간단합니다.
internal void Invalidate() { list = null; next = null; prev = null; }
7 결정하려면 노드 값이 값으로 존재하면 Find 메서드,
public bool Contains(T value) { return Find(value) != null; }
Find 메서드 구현 세부 정보를 호출합니다. API 및 FindLast와 유사합니다. 연결 목록 방식이므로 끝에서 연결 목록을 순회하세요.
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 }
8 배열 구현에 대한 또 다른 데이터 복사본을 살펴보겠습니다.
public void CopyTo(T[] array, int index) { if (array == null) { throw new ArgumentNullException(nameof(array)); } if (index < 0) { throw new ArgumentOutOfRangeException(nameof(index), index, SR.ArgumentOutOfRange_NeedNonNegNum); } if (index > array.Length) { throw new ArgumentOutOfRangeException(nameof(index), index, SR.ArgumentOutOfRange_BiggerThanCollection); } if (array.Length - index < Count) { throw new ArgumentException(SR.Arg_InsufficientSpace); } LinkedListNode<T> node = head; if (node != null) { do { array[index++] = node.item; node = node.next; } while (node != head); //双向链表,再次遍历到头结点时 } }
위 내용은 .NET Framework-이중 연결 목록(LinkedList) 코드 분석(그림)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











LinkedList 클래스의 RemoveLast() 메소드를 사용하여 연결된 목록의 마지막 요소를 삭제합니다. LinkedList는 Java 컬렉션 프레임워크의 일반적인 데이터 구조로 이중 연결 목록 형식으로 요소를 저장합니다. LinkedList 클래스에서 제공하는 메소드를 통해 연결리스트에 대한 요소 추가, 삭제, 수정 등의 작업을 쉽게 수행할 수 있습니다. 일부 시나리오에서는 연결된 목록의 마지막 요소를 삭제해야 할 수도 있습니다. LinkedList 클래스는 RemoveLas를 제공합니다.

LinkedList는 List, Deque 및 Queue의 세 가지 인터페이스를 구현하는 JavaCollectionFramework의 일반 클래스입니다. 이는 각 요소가 서로 연결되는 선형 데이터 구조인 LinkedList 데이터 구조의 기능을 제공합니다. 요소 추가, 제거 및 순회를 포함하여 LinkedList에서 다양한 작업을 수행할 수 있습니다. LinkedList 컬렉션에 요소를 추가하려면 add(), addFirst() 및 addLast()와 같은 다양한 내장 메서드를 사용할 수 있습니다. LinkedList에 요소를 추가하기 위해 이러한 메소드를 사용하는 방법을 살펴보겠습니다. 자바에서

이 문제에서는 연결 리스트의 헤드에 대한 포인터와 정수 k가 제공됩니다. 크기가 k인 그룹에서는 연결된 목록을 뒤집어야 합니다. 예를 들어 -Input:1<->2<->3<->4<->5(이중 링크 목록),k=3Output:3<->2<->1<->5<->4 솔루션 찾기 방법 이 문제에서는 이 문제를 해결하기 위한 재귀 알고리즘을 공식화합니다. 이 방법에서는 재귀를 사용하고 재귀를 사용하여 문제를 해결합니다. 예#include<iostream&

Java의 LinkedList 클래스는 연결된 목록의 헤드에 요소를 추가하는 addFirst() 메서드를 제공합니다. 이 방법의 기능은 연결 목록의 시작 부분에 요소를 추가하고 원래 연결 목록의 다른 요소를 뒤로 이동하는 것입니다. 다음은 LinkedList.addFirst() 메서드를 사용하여 연결 목록의 헤드에 요소를 추가하는 샘플 코드입니다. importjava.util.LinkedList;publicclassMain{pu

Java 문서 해석: LinkedList 클래스의 addFirst() 메소드에 대한 기능 분석 LinkedList는 Java 컬렉션 프레임워크의 이중 연결 목록 구현 클래스로 목록에서 작업을 추가, 삭제 및 검색하기 위한 일련의 메소드를 제공합니다. 그 중 addFirst() 메소드는 LinkedList 클래스의 중요한 메소드 중 하나입니다. 이 기사에서는 특정 코드 예제와 함께 addFirst() 메서드의 기능에 대한 심층 분석을 제공합니다. addFirst() 메서드

Java 문서 해석: LinkedList 클래스의 addLast() 메소드에 대한 기능 분석 Java 컬렉션 프레임워크에서 LinkedList 클래스는 이중 연결 목록으로 구현된 List 인터페이스입니다. LinkedList 클래스는 addLast() 메서드를 포함하여 연결된 목록을 작동하기 위한 다양한 메서드를 제공합니다. 이 기사에서는 LinkedList의 addLast() 메소드에 대한 자세한 분석을 제공하고 특정 코드 예제를 제공합니다. addLast() 메소드의 기능은 지정된 요소를 추가하는 것입니다.

LinkedList 클래스의 toArray() 메서드는 현재 LinkedList 객체를 객체 유형의 배열로 변환하여 반환합니다. 이 배열에는 이 목록의 모든 요소가 올바른 순서(첫 번째 요소부터 마지막 요소까지)로 포함됩니다. 이는 배열 기반 API와 컬렉션 기반 API 사이의 브리지 역할을 합니다. 따라서 LinkedList를 배열로 변환하고 LinkedList 클래스를 인스턴스화합니다. add() 메서드를 사용하여 채웁니다. 위에서 생성한 연결리스트에서 toArray() 메서드를 호출하고 객체 배열을 검색합니다. 개체 배열의 각 요소를 문자열로 변환합니다. 예 importjava.util.Arrays;importjava.uti의 실시간 데모

.NET 비동기 프로그래밍, LINQ 및 EFCORE의 핵심 개념은 다음과 같습니다. 1. 비동기 프로그래밍은 비동기 및 대기하는 응용 프로그램 응답 성을 향상시킵니다. 2. LINQ는 Unified Syntax를 통해 데이터 쿼리를 단순화합니다. 3. Efcore는 ORM을 통해 데이터베이스 작업을 단순화합니다.
