Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //прямой связанный список
- public class LinkedList : ILinkedList
- {
- private IUpgradedListItem _first;
- private IUpgradedListItem _last;
- //добавить элемент в начало
- public void AddFirst(IListItem item)
- {
- var tempItem = new ListItem(item.Value, null, _first);
- if (_last == null)
- _last = tempItem;
- if (_first == null)
- {
- _first = tempItem;
- }
- else
- {
- _first.SetPrev(tempItem);
- _first = tempItem;
- }
- }
- //добавить элемент в конец
- public void AddLast(IListItem item)
- {
- var tempItem = new ListItem(item.Value, _last);
- if (_first == null)
- _first = tempItem;
- if (_last == null)
- {
- _last = tempItem;
- }
- else
- {
- _last.SetNext(tempItem);
- _last = tempItem;
- }
- }
- //вставить элемент перед элементом с указанным индексом
- //если элемента нет - вставить в конец
- public void Insert(IListItem item, int index)
- {
- if (index < 0)
- return;
- var listItem = _first;
- var i = 0;
- while (i != index)
- {
- i++;
- listItem = (IUpgradedListItem)listItem?.Next();
- if (listItem == null)
- {
- AddLast(item);
- return;
- }
- }
- var temp = (IUpgradedListItem)listItem.Prev();
- listItem.SetPrev(item);
- temp.SetNext(item);
- ((IUpgradedListItem)item).SetNext(listItem);
- ((IUpgradedListItem)item).SetPrev(temp);
- }
- //проверка есть ли элементы в списке
- public bool IsEmpty()
- {
- return _first == null;
- }
- //вернуть первый элемент в списке
- public IListItem GetFirstItem()
- {
- return _first;
- }
- //вернуть все элементы списка, кроме первого
- public IEnumerable<IListItem> GetAll()
- {
- var item = _first;
- while (item != null)
- {
- yield return item;
- item = (IUpgradedListItem)item.Next();
- }
- }
- //очистить список
- public void Clear()
- {
- _first = null;
- _last = null;
- }
- public void Reverse()
- {
- var start = _first;
- _last = _first;
- while (start != null)
- {
- var temp = (IUpgradedListItem)start.Next();
- start.SetNext(start.Prev());
- start.SetPrev(temp);
- if (start.Prev() == null)
- _first = start;
- start = (IUpgradedListItem)start.Prev();
- }
- }
- }
- //элемент связанного списка
- public class ListItem : IUpgradedListItem
- {
- private IListItem _next;
- private IListItem _prev;
- public ListItem(object obj, IListItem prev = null, IListItem next = null)
- {
- //логика инициализации
- _value = obj;
- this._prev = prev;
- this._next = next;
- }
- //хранимое значение
- private object _value;
- public object Value
- {
- get
- {
- return _value;
- }
- }
- //предыдущий связанный элемент списка
- public IListItem Prev()
- {
- return _prev;
- }
- //следующий связанный элемент списка
- public IListItem Next()
- {
- return _next;
- }
- public void SetPrev(IListItem prev)
- {
- this._prev = prev;
- }
- public void SetNext(IListItem next)
- {
- this._next = next;
- }
- public override string ToString()
- {
- return Value.ToString();
- }
- }
- public interface IUpgradedListItem : IListItem
- {
- void SetPrev(IListItem prev);
- void SetNext(IListItem next);
- }
- }
Add Comment
Please, Sign In to add comment