elena1234

Dobly Linked List- remove element in the middle

Mar 1st, 2021 (edited)
207
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.55 KB | None | 0 0
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4.  
  5. namespace LinkedListTraversal
  6. {
  7.     class DoublyLinkedList<T> : IEnumerable<T>
  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 prevNode, T value, Node nextNode)
  18.             {
  19.                 this.PrevNode = prevNode;
  20.                 this.Value = value;
  21.                 this.NextNode = nextNode;
  22.             }
  23.             public Node PrevNode { get; set; }
  24.             public T Value { get; set; }
  25.             public Node NextNode { get; set; }
  26.         }
  27.  
  28.         private Node Head { get; set; }
  29.         private Node Tail { get; set; }
  30.         public int Count { get; private set; }
  31.  
  32.         public void Add(T value)
  33.         {
  34.             if (this.Count == 0)
  35.             {
  36.                 this.Head = new Node(null, value, null);
  37.                 this.Tail = this.Head;
  38.                 this.Count = 1;
  39.             }
  40.  
  41.             else
  42.             {
  43.                 Node newNode = new Node(this.Tail, value, null);
  44.                 this.Tail.NextNode = newNode;
  45.                 this.Tail = newNode;
  46.                 this.Count++;
  47.             }
  48.         }
  49.  
  50.         public bool Remove(T value)
  51.         {
  52.             Node currentNode = this.Head;
  53.             if (this.Count == 0)
  54.             {
  55.                 throw new InvalidOperationException();
  56.             }
  57.  
  58.            else if (this.Count == 1)
  59.             {
  60.                 if (currentNode.Value.Equals(value))
  61.                 {
  62.                     this.Head = this.Tail = default;
  63.                     this.Count = 0;
  64.                     return true;
  65.                 }                  
  66.             }
  67.  
  68.             else if (this.Count > 1)
  69.             {
  70.                 while (currentNode != null)
  71.                 {
  72.                     if (currentNode.Value.Equals(value) && currentNode.Equals(this.Head)) // removed element is this.Head
  73.                     {
  74.                         currentNode.NextNode.PrevNode = null;
  75.                         this.Head = currentNode.NextNode;
  76.                         Count--;
  77.                         return true;
  78.                     }
  79.  
  80.                     else if(currentNode.Value.Equals(value) && currentNode.Equals(this.Tail)) // removed element is this.Tail
  81.                     {
  82.                         currentNode.PrevNode.NextNode = null;
  83.                         this.Tail = currentNode.PrevNode.NextNode;
  84.                         Count--;
  85.                         return true;
  86.                     }
  87.  
  88.                     else if (currentNode.Value.Equals(value)) // removed element is in the middle
  89.                     {
  90.                         currentNode.PrevNode.NextNode = currentNode.NextNode;
  91.                         currentNode.NextNode.PrevNode = currentNode.PrevNode;
  92.                         Count--;
  93.                         return true;
  94.                     }
  95.  
  96.                     currentNode = currentNode.NextNode;
  97.                 }
  98.             }
  99.  
  100.             return false;
  101.         }
  102.  
  103.         public IEnumerator<T> GetEnumerator()
  104.         {
  105.             Node currentNode = this.Head;
  106.  
  107.             for (int i = 0; i < this.Count; i++)
  108.             {
  109.                 yield return currentNode.Value;
  110.                 currentNode = currentNode.NextNode;
  111.             }
  112.         }
  113.  
  114.         IEnumerator IEnumerable.GetEnumerator()
  115.         {
  116.             return GetEnumerator();
  117.         }
  118.     }
  119. }
  120.  
Add Comment
Please, Sign In to add comment