elena1234

Create Doubly Linked List - yield return

Feb 16th, 2021 (edited)
227
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.46 KB | None | 0 0
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4.  
  5. namespace CreateDoublyLinkedList
  6. {
  7.     public class DoublyLinkedList : IEnumerable<int>
  8.     {
  9.         public DoublyLinkedList()
  10.         {
  11.             this.Head = this.Tail = default;
  12.             this.Count = 0;
  13.         }
  14.  
  15.         private class Node
  16.         {
  17.             public Node(Node previousNode, int value, Node nextNode)
  18.             {
  19.                 this.PreviousNode = previousNode;
  20.                 this.Value = value;
  21.                 this.NextNode = nextNode;
  22.             }
  23.  
  24.             public Node PreviousNode { get; set; }
  25.             public int  Value { get; set; }
  26.             public Node NextNode { get; set; }
  27.         }
  28.         private Node Head { get; set; }
  29.         private Node Tail { get; set; }
  30.         public int Count { get; private set; }
  31.  
  32.         public void AddFirst(int element)
  33.         {
  34.             if (this.Count == 0)
  35.             {
  36.                 this.Head = this.Tail = new Node(null, element, null);
  37.                 this.Count++;
  38.             }
  39.             else
  40.             {
  41.                 var newNode = new Node(null, element, this.Head);
  42.                 this.Head.PreviousNode = newNode;
  43.                 this.Head = newNode;
  44.                 this.Count++;
  45.             }          
  46.         }
  47.  
  48.         public void AddLast(int element)
  49.         {
  50.             if (this.Count == 0)
  51.             {
  52.                 this.Head = this.Tail = new Node(null, element, null);
  53.                 this.Count++;
  54.             }
  55.             else
  56.             {
  57.                 var newNode = new Node(this.Tail, element, null);
  58.                 this.Tail.NextNode = newNode;
  59.                 this.Tail = newNode;
  60.                 this.Count++;
  61.             }          
  62.         }
  63.  
  64.         public int RemoveFirst()
  65.         {
  66.             if (this.Count == 0)
  67.             {
  68.                 throw new Exception("Doubly list is empty!");
  69.             }
  70.             var firstNode = this.Head;
  71.             var secondNode = this.Head.NextNode;
  72.             secondNode.PreviousNode = null;
  73.             firstNode.NextNode = null;
  74.             this.Head = secondNode;
  75.             this.Count--;
  76.             return firstNode.Value;          
  77.         }
  78.  
  79.         public int RemoveLast()
  80.         {
  81.             if (this.Count == 0)
  82.             {
  83.                 throw new Exception("Doubly list is empty!");
  84.             }
  85.             var lastNode = this.Tail;
  86.             var previousNode = this.Tail.PreviousNode;
  87.             previousNode.NextNode = null;
  88.             lastNode.PreviousNode = null;
  89.             this.Tail = previousNode;
  90.             this.Count--;
  91.             return lastNode.Value;
  92.         }
  93.  
  94.         public IEnumerator<int> GetEnumerator()
  95.         {
  96.             var currentNode = this.Head;
  97.             for (int i = 0; i < this.Count; i++)
  98.             {
  99.                 yield return currentNode.Value;
  100.                 currentNode = currentNode.NextNode;
  101.             }
  102.         }
  103.  
  104.         IEnumerator IEnumerable.GetEnumerator()
  105.         {
  106.             return GetEnumerator();
  107.         }
  108.  
  109.         public int[] ToArray()
  110.         {
  111.             var newArray = new int[this.Count];
  112.             var currentNode = this.Head;
  113.             for (int i = 0; i <= newArray.Length-1; i++)
  114.             {
  115.                 newArray[i] = currentNode.Value;
  116.                 currentNode = currentNode.NextNode;
  117.             }
  118.             return newArray;
  119.         }
  120.     }
  121. }
  122.  
Add Comment
Please, Sign In to add comment