Advertisement
jwow22

Linked List

Jan 4th, 2022
164
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.30 KB | None | 0 0
  1. namespace System.Collections.Generic
  2. {
  3.     public class LList<T>
  4.     {
  5.         public class Node
  6.         {
  7.             public T Item { get; }
  8.             public Node Next { get; set; }
  9.             public Node(T item)
  10.             {
  11.                 this.Item = item;
  12.             }
  13.         }
  14.         public Node Head { get; private set; }
  15.         public Node Tail { get; private set; }
  16.         public int Count { get; private set; }
  17.        
  18.         // Operations
  19.         public void AddLast(T item)
  20.         {
  21.             Node node = new Node(item);
  22.            
  23.             if (Head == null)
  24.             {
  25.                 Head = node;
  26.                 Tail = node;
  27.             }
  28.            
  29.             if (Count == 1)
  30.             {
  31.                 Tail = node;
  32.                 Head.Next = Tail;
  33.             }
  34.             if (Count > 1)
  35.             {
  36.                 Tail.Next = node;
  37.                 Tail = node;
  38.             }
  39.             Count++;
  40.         }
  41.            
  42.         public void AddFirst(T item)
  43.         {
  44.             Node node = new Node(item);
  45.                
  46.             if (Head == null)
  47.             {
  48.                 Head = node;
  49.                 Tail = node;
  50.             }
  51.             if (Count == 1)
  52.             {
  53.                 Node temp = Head;
  54.                 node.Next = temp;
  55.                 Head = node;
  56.                 Tail = temp;
  57.             }
  58.             if (Count > 1)
  59.             {
  60.                 Node temp = Head;
  61.                 node.Next = temp;
  62.                 Head = node;
  63.             }
  64.             Count++;
  65.         }
  66.  
  67.         public void Insert(T item, int index)
  68.         {
  69.             Node newNode = new Node(item);
  70.            
  71.             if (index == 0)
  72.             {
  73.                 AddFirst(item);
  74.                 return;
  75.             }
  76.                
  77.             if (index >= Count)
  78.             {
  79.                 AddLast(item);
  80.                 return;
  81.             }
  82.  
  83.             int counter = 1;
  84.             Node node = Head;
  85.             while (node.Next != null)
  86.             {
  87.                 if (counter == index)
  88.                 {
  89.                     Node temp = node.Next;
  90.                     node.Next = newNode;
  91.                     newNode.Next = temp;
  92.                     Count++;
  93.                     return;
  94.                 }
  95.                 node = node.Next;
  96.                 counter++;
  97.             }
  98.         }
  99.            
  100.         public int IndexOf(T item)
  101.         {
  102.             int counter = 0;
  103.             Node node = Head;
  104.             while (node != null)
  105.             {
  106.                 if (node.Item.Equals(item))
  107.                 {
  108.                     return counter;
  109.                 }
  110.                 counter++;
  111.                 node = node.Next;
  112.             }
  113.             return -1;
  114.         }
  115.  
  116.         public T ItemOf(int index)
  117.         {
  118.             int counter = 0;
  119.             Node node = Head;
  120.             while (node != null)
  121.             {
  122.                 if (counter == index)
  123.                 {
  124.                     return node.Item;
  125.                 }
  126.                 counter++;
  127.                 node = node.Next;
  128.             }
  129.             return default;
  130.         }
  131.            
  132.         public bool Contains(T item)
  133.         {
  134.             return IndexOf(item) != -1;
  135.         }
  136.            
  137.         public void Remove(T item)
  138.         {
  139.             if (Head.Item.Equals(item))
  140.             {
  141.                 Head = Head.Next;
  142.                 Count--;
  143.                 return;
  144.             }
  145.  
  146.             Node node = Head;
  147.             while (node.Next != null)
  148.             {
  149.                 if (node.Next.Item.Equals(item))
  150.                 {
  151.                     node.Next = node.Next.Next;
  152.                     Count--;
  153.                     return;
  154.                 }
  155.                 node = node.Next;
  156.             }
  157.         }
  158.  
  159.         public void RemoveAt(int index)
  160.         {
  161.             if (index == 0)
  162.             {
  163.                 Head = Head.Next;
  164.                 Count--;
  165.                 return;
  166.             }
  167.  
  168.             int counter = 1;
  169.             Node node = Head;
  170.             while (node.Next != null)
  171.             {
  172.                 if (counter == index)
  173.                 {
  174.                     if (index == Count - 1)
  175.                     {  
  176.                         Tail = node;
  177.                         Tail.Next = null;
  178.                         Count--;
  179.                         return;
  180.                     }
  181.                    
  182.                     node.Next = node.Next.Next;
  183.                     Count--;
  184.                     return;
  185.                 }
  186.                 node = node.Next;
  187.                 counter++;
  188.             }
  189.         }
  190.  
  191.         public void RemoveTailUntil(int index)
  192.         {
  193.             while (Count - 1 != index - 1)
  194.             {
  195.                 RemoveAt(Count - 1);
  196.             }
  197.         }
  198.        
  199.         // Indexer
  200.         public T this[int index]
  201.         {
  202.             get => ItemOf(index);
  203.             set
  204.             {
  205.                 if (index < 0 || index >= Count)
  206.                 {
  207.                     throw new IndexOutOfRangeException("Invalid index: " + index);
  208.                 }
  209.                 Insert(value, index);
  210.             }
  211.         }
  212.     }
  213. }
  214.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement