xotoi

Untitled

Oct 3rd, 2017
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.70 KB | None | 0 0
  1.     //прямой связанный список
  2.     public class LinkedList : ILinkedList
  3.     {
  4.         private IUpgradedListItem _first;
  5.         private IUpgradedListItem _last;
  6.  
  7.         //добавить элемент в начало
  8.         public void AddFirst(IListItem item)
  9.         {
  10.             var tempItem = new ListItem(item.Value, null, _first);
  11.             if (_last == null)
  12.                 _last = tempItem;
  13.  
  14.             if (_first == null)
  15.             {
  16.                 _first = tempItem;
  17.             }
  18.             else
  19.             {
  20.                 _first.SetPrev(tempItem);
  21.                 _first = tempItem;
  22.             }
  23.         }
  24.  
  25.         //добавить элемент в конец
  26.         public void AddLast(IListItem item)
  27.         {
  28.             var tempItem = new ListItem(item.Value, _last);
  29.             if (_first == null)
  30.                 _first = tempItem;
  31.  
  32.             if (_last == null)
  33.             {
  34.                 _last = tempItem;
  35.             }
  36.             else
  37.             {
  38.                 _last.SetNext(tempItem);
  39.                 _last = tempItem;
  40.             }
  41.         }
  42.  
  43.         //вставить элемент перед элементом с указанным индексом
  44.         //если элемента нет - вставить в конец
  45.         public void Insert(IListItem item, int index)
  46.         {
  47.             if (index < 0)
  48.                 return;
  49.  
  50.             var listItem = _first;
  51.             var i = 0;
  52.             while (i != index)
  53.             {
  54.                 i++;
  55.                 listItem = (IUpgradedListItem)listItem?.Next();
  56.  
  57.                 if (listItem == null)
  58.                 {
  59.                     AddLast(item);
  60.                     return;
  61.                 }
  62.             }
  63.  
  64.             var temp = (IUpgradedListItem)listItem.Prev();
  65.             listItem.SetPrev(item);
  66.             temp.SetNext(item);
  67.             ((IUpgradedListItem)item).SetNext(listItem);
  68.             ((IUpgradedListItem)item).SetPrev(temp);
  69.         }
  70.  
  71.         //проверка есть ли элементы в списке
  72.         public bool IsEmpty()
  73.         {
  74.             return _first == null;
  75.         }
  76.  
  77.         //вернуть первый элемент в списке
  78.         public IListItem GetFirstItem()
  79.         {
  80.             return _first;
  81.         }
  82.  
  83.         //вернуть все элементы списка, кроме первого
  84.         public IEnumerable<IListItem> GetAll()
  85.         {
  86.             var item = _first;
  87.             while (item != null)
  88.             {
  89.                 yield return item;
  90.                 item = (IUpgradedListItem)item.Next();
  91.             }
  92.         }
  93.  
  94.         //очистить список
  95.         public void Clear()
  96.         {
  97.             _first = null;
  98.             _last = null;
  99.         }
  100.  
  101.         public void Reverse()
  102.         {
  103.             var start = _first;
  104.             _last = _first;
  105.  
  106.             while (start != null)
  107.             {
  108.                 var temp = (IUpgradedListItem)start.Next();
  109.                 start.SetNext(start.Prev());
  110.                 start.SetPrev(temp);
  111.  
  112.                 if (start.Prev() == null)
  113.                     _first = start;
  114.  
  115.                 start = (IUpgradedListItem)start.Prev();
  116.             }
  117.         }
  118.     }
  119.  
  120.     //элемент связанного списка
  121.     public class ListItem : IUpgradedListItem
  122.     {
  123.         private IListItem _next;
  124.         private IListItem _prev;
  125.  
  126.         public ListItem(object obj, IListItem prev = null, IListItem next = null)
  127.         {
  128.             //логика инициализации
  129.             _value = obj;
  130.             this._prev = prev;
  131.             this._next = next;
  132.         }
  133.  
  134.         //хранимое значение
  135.         private object _value;
  136.         public object Value
  137.         {
  138.             get
  139.             {
  140.                 return _value;
  141.             }
  142.         }
  143.         //предыдущий связанный элемент списка
  144.         public IListItem Prev()
  145.         {
  146.             return _prev;
  147.         }
  148.  
  149.         //следующий связанный элемент списка
  150.         public IListItem Next()
  151.         {
  152.             return _next;
  153.         }
  154.  
  155.         public void SetPrev(IListItem prev)
  156.         {
  157.             this._prev = prev;
  158.         }
  159.  
  160.         public void SetNext(IListItem next)
  161.         {
  162.             this._next = next;
  163.         }
  164.  
  165.         public override string ToString()
  166.         {
  167.             return Value.ToString();
  168.         }
  169.     }
  170.  
  171.     public interface IUpgradedListItem : IListItem
  172.     {
  173.         void SetPrev(IListItem prev);
  174.         void SetNext(IListItem next);
  175.     }
  176.  
  177.     }
Add Comment
Please, Sign In to add comment