/// <summary> /// Добавление элемента в начало списка /// </summary> /// <param name="val">элемент для добавления</param> public void AddFirst(int val) { DoublyNode newNode = new DoublyNode(val); if (head != null) { newNode.Next = head; head.Prev = newNode; } head = newNode; size++; }
/// <summary> /// Добавить массив элементов в позицию index со сдвигом оставшихся элементов вправо /// </summary> /// <param name="index">Позиция, на которую добавляем элменты</param> /// <param name="values">Массив добавляемых элементов</param> public void AddAt(int index, int[] values) { if (index < 0 || index >= size) { throw new ArgumentException("Неверное значение index"); } if (values.Length == 0) { return; } DoublyNode curentNode = head; for (int i = 0; i < index - 1 && curentNode.Next != null; i++) { curentNode = curentNode.Next; } DoublyNode rightPartNode; if (index == 0) { rightPartNode = curentNode; DoublyNode startLeftNode = new DoublyNode(values[0]); DoublyNode node = startLeftNode; size++; for (int i = 1; i < values.Length; i++) { DoublyNode newNode = new DoublyNode(values[i]); newNode.Prev = node; node.Next = newNode; node = node.Next; } rightPartNode.Prev = node; node.Next = rightPartNode; head = startLeftNode; } else { rightPartNode = curentNode.Next; for (int i = 0; i < values.Length; i++) { DoublyNode newNode = new DoublyNode(values[i]); newNode.Prev = curentNode; curentNode.Next = newNode; curentNode = curentNode.Next; size++; } rightPartNode.Prev = curentNode; curentNode.Next = rightPartNode; } }
/// <summary> /// Удалеие последнего элемента /// </summary> public void RemoveLast() { if (head != null) { DoublyNode curentNode = head; for (int i = 1; i < size - 1; i++) { curentNode = curentNode.Next; } curentNode.Next = null; size--; } }
/// <summary> /// Значение элемента списка по индексу index /// </summary> /// <param name="index">индекс элемента</param> /// <returns></returns> public int Get(int index) { if (index < 0 || index >= size) { throw new ArgumentException("Неверное значение index"); } DoublyNode curentNode = head; for (int i = 0; i < index; i++) { curentNode = curentNode.Next; } return(curentNode.Value); }
/// <summary> /// Поменять значние элемента с указанным индексом /// </summary> /// <param name="idx">Индекс элемента</param> /// <param name="val">Новое значение элемента</param> public void Set(int idx, int val) { if (idx < 0 || idx >= size) { throw new ArgumentException("Неверное значение index"); } DoublyNode curentNode = head; for (int i = 0; i < idx; i++) { curentNode = curentNode.Next; } curentNode.Value = val; }
/// <summary> /// Значение последнего элемента списка /// </summary> /// <returns>Значение последнего элемента списка</returns> public int GetLast() { if (size == 0) { throw new NullReferenceException("Список пуст"); } DoublyNode curentNode = head; while (curentNode.Next != null) { curentNode = curentNode.Next; } return(curentNode.Value); }
/// <summary> /// Индекс первого вхождения элемента /// </summary> /// <param name="value">Элемент</param> /// <returns>Индекс первого вхождения элемента value или -1 если элемента нет в DoublyArrayList</returns> public int IndexOf(int value) { DoublyNode curentNode = head; for (int i = 0; i < size; i++) { if (curentNode.Value == value) { return(i); } else { curentNode = curentNode.Next; } } return(-1); }
/// <summary> /// Опередляет присутствует ли элемент в DoublyLinkedList /// </summary> /// <param name="value">Элемент для поиска</param> /// <returns>true- элемент присутствует, false - элемент отсутствует</returns> public bool Contains(int value) { DoublyNode curentNode = head; for (int i = 0; i < size; i++) { if (curentNode.Value == value) { return(true); } else { curentNode = curentNode.Next; } } return(false); }
/// <summary> /// Добавить значение в конец списка /// </summary> /// <param name="value">Добавляемое значение</param> public void AddLast(int[] values) { if (values.Length == 0) { return; } DoublyNode curentNode = head; if (head == null) { //список пуст,добавляем элементы с начала if (values.Length > 0) { DoublyNode newNode = new DoublyNode(values[0]); head = newNode; size++; for (int i = 1; i < values.Length; i++) { newNode = new DoublyNode(values[i]); newNode.Prev = curentNode; curentNode.Next = newNode; curentNode = curentNode.Next; size++; } } } else { //список не пуст-идем до конца списка while (curentNode.Next != null) { curentNode = curentNode.Next; } //добавляем в конец списка for (int i = 0; i < values.Length; i++) { DoublyNode newNode = new DoublyNode(values[i]); newNode.Prev = curentNode; curentNode.Next = newNode; curentNode = curentNode.Next; size++; } } }
/// <summary> /// Преобразует DoublyLinkedList в одномерный массив значений /// </summary> /// <returns>Значения DoublyLinkedList в виде одномерного массива</returns> public int[] ToArray() { if (size == 0) { return(new int[] { }); } else { int[] result = new int[size]; DoublyNode nextNode = head; for (int i = 0; i < result.Length; i++) { result[i] = nextNode.Value; nextNode = nextNode.Next; } return(result); } }
/// <summary> /// Добавить значение в конец DoublyLinkedList /// </summary> /// <param name="value">Добавляемое значение</param> public void AddLast(int value) { DoublyNode newNode = new DoublyNode(value); if (head == null)//список пустой-добавляем первый элемент { head = newNode; } else { //список не пустой-надо пройтись по списку до последнего, затем добавить новый элемент DoublyNode curentNode = head; while (curentNode.Next != null) { curentNode = curentNode.Next; } newNode.Prev = curentNode; curentNode.Next = newNode; } size++; }
public DoublyLinkedList() { head = null; size = 0; }