Advertisement
Graf_Rav

Untitled

Feb 12th, 2019
170
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.18 KB | None | 0 0
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7.  
  8. namespace DoublyLinkedList {
  9. public class DoublyLinkedList<T> : IEnumerable<T> {
  10. public class DoublyLinkedListNode<T> {
  11. public DoublyLinkedListNode<T> Next {
  12. get; set;
  13. }
  14.  
  15. public DoublyLinkedListNode<T> Previous {
  16. get; set;
  17. }
  18.  
  19. public T Value {
  20. get; set;
  21. }
  22.  
  23. public DoublyLinkedListNode(T value, DoublyLinkedListNode<T> previous, DoublyLinkedListNode<T> next) {
  24. Value = value;
  25. Previous = previous;
  26. Next = next;
  27. }
  28. }
  29.  
  30. public DoublyLinkedList() {
  31. First = null;
  32. Last = null;
  33. Count = 0;
  34. }
  35.  
  36. public DoublyLinkedListNode<T> First {
  37. get;
  38. private set;
  39. }
  40.  
  41. public DoublyLinkedListNode<T> Last {
  42. get;
  43. private set;
  44. }
  45.  
  46. public int Count {
  47. get;
  48. private set;
  49. }
  50.  
  51. public void AddAfter(DoublyLinkedListNode<T> node, T value) {
  52. DoublyLinkedListNode<T> newNode = new DoublyLinkedListNode<T>(value, node, node.Next);
  53. newNode.Previous.Next = newNode;
  54. newNode.Next.Previous = newNode;
  55. Count++;
  56. }
  57.  
  58. public void AddAfter(DoublyLinkedListNode<T> node, DoublyLinkedListNode<T> newNode) {
  59. newNode.Next = node.Next;
  60. newNode.Previous = node;
  61. newNode.Previous.Next = newNode;
  62. newNode.Next.Previous = newNode;
  63. Count++;
  64. }
  65.  
  66. public void AddBefore(DoublyLinkedListNode<T> node, T value) {
  67. DoublyLinkedListNode<T> newNode = new DoublyLinkedListNode<T>(value, node.Previous, node);
  68. newNode.Previous.Next = newNode;
  69. newNode.Next.Previous = newNode;
  70. Count++;
  71. }
  72.  
  73. public void AddBefore(DoublyLinkedListNode<T> node, DoublyLinkedListNode<T> newNode) {
  74. newNode.Next = node;
  75. newNode.Previous = node.Previous;
  76. newNode.Previous.Next = newNode;
  77. newNode.Next.Previous = newNode;
  78. Count++;
  79. }
  80.  
  81. public void AddFirst(T value) {
  82. if (Count == 0) {
  83. First = new DoublyLinkedListNode<T>(value, null, null);
  84. Last = First;
  85. }
  86. else {
  87. DoublyLinkedListNode<T> newNode = new DoublyLinkedListNode<T>(value, null, First);
  88. First.Next = newNode;
  89. }
  90. Count++;
  91. }
  92.  
  93. public void AddFirst(DoublyLinkedListNode<T> newNode) {
  94. if (Count == 0) {
  95. First = newNode;
  96. newNode.Next = null;
  97. newNode.Previous = null;
  98. Last = First;
  99. }
  100. else {
  101. newNode.Next = First;
  102. newNode.Previous = null;
  103. First.Previous = newNode;
  104. }
  105. Count++;
  106. }
  107.  
  108. public void AddLast(T value) {
  109. if (Count == 0) {
  110. First = new DoublyLinkedListNode<T>(value, null, null);
  111. Last = First;
  112. }
  113. else {
  114. DoublyLinkedListNode<T> newNode = new DoublyLinkedListNode<T>(value, Last, null);
  115. Last.Next = newNode;
  116. }
  117. Count++;
  118. }
  119.  
  120. public void AddLast(DoublyLinkedListNode<T> newNode) {
  121. if (Count == 0) {
  122. First = newNode;
  123. newNode.Next = null;
  124. newNode.Previous = null;
  125. Last = First;
  126. }
  127. else {
  128. newNode.Previous = Last;
  129. newNode.Next = null;
  130. Last.Next = newNode;
  131. }
  132. Count++;
  133. }
  134.  
  135. public void RemoveFirst() {
  136. First.Next.Previous = null;
  137. First = First.Next;
  138. Count--;
  139. }
  140.  
  141. public void RemoveLast() {
  142. Last.Previous.Next = null;
  143. Last = Last.Previous;
  144. Count--;
  145. }
  146.  
  147. IEnumerator IEnumerable.GetEnumerator() {
  148. return GetEnumerator();
  149. }
  150.  
  151. public IEnumerator<T> GetEnumerator() {
  152. return new ListEnumerator<T>(First);
  153. }
  154.  
  155. public class ListEnumerator<T> : IEnumerator<T> {
  156. public ListEnumerator(DoublyLinkedListNode<T> node) {
  157. first = node;
  158. Reset();
  159. }
  160.  
  161. private DoublyLinkedListNode<T> curNode;
  162. private DoublyLinkedListNode<T> first;
  163.  
  164. public object Current {
  165. get {
  166. return ((IEnumerator<T>)this).Current;
  167. }
  168. }
  169.  
  170. T IEnumerator<T>.Current {
  171. get {
  172. if (curNode == null) {
  173. throw new InvalidOperationException();
  174. }
  175. return curNode.Value;
  176. }
  177. }
  178.  
  179. public bool MoveNext() {
  180. if (curNode.Next == null) {
  181. return false;
  182. }
  183. else {
  184. curNode = curNode.Next;
  185. return true;
  186. }
  187. }
  188.  
  189. public void Reset() {
  190. curNode = first;
  191. }
  192.  
  193. public void Dispose() {
  194.  
  195. }
  196. }
  197. }
  198. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement