Advertisement
Guest User

Untitled

a guest
Mar 24th, 2019
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.47 KB | None | 0 0
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Diagnostics;
  5. using System.Linq;
  6.  
  7. namespace Swappings
  8. {
  9. class Program
  10. {
  11. static void Main()
  12. {
  13. int endNumber = int.Parse(Console.ReadLine());
  14.  
  15. List<int> numbers = Console.ReadLine().Split(' ').Select(int.Parse).ToList();
  16.  
  17. MyLinkedList<int> collectionOfNumbers = new MyLinkedList<int>();
  18.  
  19. for (int i = endNumber; i >= 1; i--)
  20. {
  21. collectionOfNumbers.AddHead(i);
  22. }
  23.  
  24. foreach (int number in numbers)
  25. {
  26. var currentElement = collectionOfNumbers.Find(number);
  27.  
  28. if (currentElement.Next != null && currentElement.Previous!=null)
  29. {
  30. var toBeTheHead = currentElement.Next;
  31. var toBeTheNext = collectionOfNumbers.Head;
  32. var toBeBeforeCurrent = collectionOfNumbers.Tail;
  33. var toBeTail = currentElement.Previous;
  34.  
  35. toBeTheHead.Previous = null;
  36. toBeTheNext.Previous = currentElement;
  37. currentElement.Next = toBeTheNext;
  38. currentElement.Previous = toBeBeforeCurrent;
  39. toBeBeforeCurrent.Next = currentElement;
  40.  
  41.  
  42. collectionOfNumbers.Head = toBeTheHead;
  43. collectionOfNumbers.Tail = toBeTail;
  44. toBeTail.Next = null;
  45. }
  46.  
  47. else if (currentElement.Next==null)
  48. {
  49. var toBeTheHead = currentElement;
  50. var toBeTheNext = collectionOfNumbers.Head;
  51. var toBeTail = currentElement.Previous;
  52.  
  53. toBeTheHead.Previous = null;
  54. toBeTheHead.Next = toBeTheNext;
  55. toBeTheNext.Previous = toBeTheHead;
  56. currentElement.Next = toBeTheNext;
  57. toBeTheNext.Previous = currentElement;
  58.  
  59. collectionOfNumbers.Head = toBeTheHead;
  60. collectionOfNumbers.Tail = toBeTail;
  61. toBeTail.Next = null;
  62. }
  63.  
  64. else if (currentElement.Previous==null)
  65. {
  66. var toBeTheHead = currentElement.Next;
  67. var toBeBeforeTheCurrent = collectionOfNumbers.Tail;
  68. var toBeTheTail = currentElement;
  69.  
  70. toBeTheHead.Previous = null;
  71. toBeBeforeTheCurrent.Next = currentElement;
  72. currentElement.Previous = toBeBeforeTheCurrent;
  73. currentElement.Next = null;
  74.  
  75. collectionOfNumbers.Head = toBeTheHead;
  76. collectionOfNumbers.Tail = toBeTheTail;
  77. toBeTheTail.Next = null;
  78.  
  79. }
  80.  
  81. }
  82.  
  83. Console.WriteLine(string.Join(" ", collectionOfNumbers));
  84. }
  85. }
  86.  
  87. //[DebuggerDisplay("{string.Join(\" \", this)}")]
  88. public class MyLinkedList<T> : IEnumerable<T> where T : struct
  89. {
  90. public void AddHead(T value)
  91. {
  92. MyNode<T> newHead = new MyNode<T>(value);
  93.  
  94. if (this.Head != null)
  95. {
  96. this.Head.Previous = newHead;
  97. }
  98.  
  99. newHead.Next = this.Head;
  100. this.Head = newHead;
  101.  
  102. if (this.Head.Next == null)
  103. {
  104. this.Tail = this.Head;
  105. }
  106. }
  107.  
  108. public void AddTail(T value)
  109. {
  110. MyNode<T> newTail = new MyNode<T>(value);
  111.  
  112. if (this.Tail != null)
  113. {
  114. this.Tail.Next = newTail;
  115. }
  116.  
  117. newTail.Previous = this.Tail;
  118. this.Tail = newTail;
  119. }
  120.  
  121. public MyNode<T> Find(T value)
  122. {
  123. MyNode<T> currentNode = this.Head;
  124.  
  125. while (!currentNode.Value.Equals(value) && currentNode.Next != null)
  126. {
  127. currentNode = currentNode.Next;
  128. }
  129.  
  130. if (!currentNode.Value.Equals(value))
  131. {
  132. throw new ArgumentOutOfRangeException("No Such Node!");
  133. }
  134.  
  135. return currentNode;
  136.  
  137. }
  138.  
  139. public void RemoveHead()
  140. {
  141. if (this.Head?.Next == null)
  142. {
  143. this.Head = null;
  144. this.Tail = null;
  145. }
  146.  
  147. else
  148. {
  149. this.Head = this.Head.Next;
  150. }
  151. }
  152.  
  153. public void RemoveTail()
  154. {
  155. if (this.Tail?.Previous == null)
  156. {
  157. this.Tail = null;
  158. this.Head = null;
  159. }
  160.  
  161. else
  162. {
  163. this.Tail = this.Tail.Previous;
  164. }
  165. }
  166.  
  167. public void RemoveNode(MyNode<T> node)
  168. {
  169. if (node.Next == null)
  170. {
  171. RemoveTail();
  172. }
  173.  
  174. else if (node.Previous == null)
  175. {
  176. RemoveHead();
  177. }
  178.  
  179. else
  180. {
  181. MyNode<T> previousNode = node.Previous;
  182. MyNode<T> nextNode = node.Next;
  183. previousNode.Next = nextNode;
  184. nextNode.Previous = previousNode;
  185. }
  186. }
  187.  
  188. IEnumerator IEnumerable.GetEnumerator()
  189. {
  190. return this.GetEnumerator();
  191. }
  192.  
  193. public IEnumerator<T> GetEnumerator()
  194. {
  195. var currentElement = this.Head;
  196.  
  197. if (this.Head != this.Tail)
  198. {
  199. while (currentElement != null)
  200. {
  201. yield return currentElement.Value;
  202. currentElement = currentElement.Next;
  203. }
  204. }
  205.  
  206. else
  207. {
  208. yield return currentElement.Value;
  209. }
  210. }
  211.  
  212.  
  213.  
  214. public MyNode<T> Head { get; set; }
  215.  
  216. public MyNode<T> Tail { get; set; }
  217. }
  218.  
  219. //[DebuggerDisplay("value = {Value}, next = {Next.Value}, previous = {Previous.Value}")]
  220. public class MyNode<T>
  221. {
  222.  
  223. public MyNode(T value)
  224. {
  225. this.Value = value;
  226. }
  227.  
  228. public MyNode<T> Next { get; set; }
  229. public MyNode<T> Previous { get; set; }
  230. public T Value { get; set; }
  231. }
  232. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement