/
GermanezZ
/
JavaExercises
Обзор
Документация
Войти
/
GermanezZ
/
JavaExercises
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
AllMetanitLessons/OpenCode/_7ManualList.java
304 строки
12 KB
germa
Уроки по Metanit
04 дек 2024, 20:39
04 дек 2024, 20:39
48d575a
Код
Авторство
О чём код?
package AllMetanitLessons.OpenCode; import java.util.Iterator; /*Реализовать собственный список в виде связанного списка. Реализовать те же операции, что и в пункте 5.*/ //Класс реализует связный список public class _7ManualList<E> implements Iterable<E> { public static void main(String[] args) { System.out.println("----- Тестирование связного списка -----"); System.out.println(); System.out.println("Создаем список и последовательно помещаем в него три элемента"); _7ManualList<String> sml = new _7ManualList<>(); sml.addLast("A"); sml.addLast("B"); sml.addLast("C"); System.out.println("Размер " + sml.size()); System.out.println("Содержимое " + sml.toString()); System.out.println("///////////////////////////////////////////////////////////"); System.out.println("Удалаем элементы по одному из начала списка"); sml.removeLast(); System.out.println("Размер " + sml.size()); System.out.println("Содержимое " + sml.toString()); sml.removeLast(); System.out.println("Размер " + sml.size()); System.out.println("Содержимое " + sml.toString()); sml.removeFirst(); System.out.println("Размер " + sml.size()); System.out.println("Содержимое " + sml.toString()); System.out.println(); System.out.println("///////////////////////////////////////////////////////////"); System.out.println("Заполняем список символами латинского алфавита"); for (char a='A';a<='Z'; a++)sml.addLast(""+a); System.out.println("Размер "+sml.size()); System.out.println("Содержимое "+sml); for (char a='z';a>='a'; a--)sml.addFirst(""+a); System.out.println("Размер "+sml.size()); System.out.println("Содержимое "+sml); System.out.println("Пeрвый элемент "+sml.getFirst()); System.out.println("Последний элемент "+sml.getLast()); System.out.println(); System.out.println("///////////////////////////////////////////////////////////"); System.out.println("Удаляем по десять элементов в начале и в конце списка. Выводим на экран удаленные элементы"); for (int i=0;i<10;i++) System.out.println("Удален элемент "+sml.removeFirst()); for (int i=0;i<10;i++) System.out.println("Удален элемент "+sml.removeLast()); System.out.println("Новый размер "+sml.size()); System.out.println("Новое содержимое "+sml); System.out.println(); System.out.println("///////////////////////////////////////////////////////////"); System.out.println("Очищаем список"); sml.clear(); System.out.println("Список очищен размер списка "+sml.size()); System.out.println(); System.out.println("///////////////////////////////////////////////////////////"); System.out.println("Снова заполняем список элементами"); sml.addLast("100"); sml.addLast("AAA"); sml.addLast("***"); sml.addLast("Git"); sml.addLast("SQL"); System.out.println("Новое содержимое "+sml); System.out.println(); System.out.println("Получаем элемент с произвольным номером"); System.out.println("Элемент №2 "+sml.get(2)); System.out.println(); System.out.println("Создаем новый список из элементов старого"); _7ManualList<String> sml2=new _7ManualList<>(sml); System.out.println("Содержимое нового списка "+sml2); System.out.println(); System.out.println("Изменяем элемент в середине списка на \"X7X\""); sml2.set("X7X",2); System.out.println("Изменяем элемент в начале списка на \"JSE\""); sml2.set("JSE",0); System.out.println("Изменяем элемент в конце списка на \"+++\""); sml2.set("+++",4); System.out.println("Список после изменений "+sml2); System.out.println(); System.out.println("Удаляем два элемента из середины нового списка"); sml2.remove(1); sml2.remove(2); System.out.println("Содержимое списка "+sml2); System.out.println("Удаляем еще два элемента"); sml2.remove(0); sml2.remove(1); System.out.println("Новый список "+sml2); System.out.println(); } private Element<E> first; //Первый элемент списка private Element<E> last; //Последний элемент списка private int sizeList; //Размер списка public _7ManualList() { first = null; last = null; sizeList = 0; } public _7ManualList(_7ManualList<? extends E> list) { this(); for (E e : list) this.addLast(e); } //Вспомогательный внутренний класс для хранения данных private class Element<E> { E content; //Хранимые данные Element<E> next; //Указатель на следующий элемент списка Element<E> prev; //Указатель на предыдущие элемент списка //Конструктор создает первый эелемент пустого списка public Element(E content) { this.content = content; next = null; prev = null; } } //Метод добавляет элемент в пустой список private void addInEmptyList(E e) { first = new Element<>(e); last = first; sizeList = 1; } //Метод добавляет элемент в начало списка public void addFirst(E e) { if (isEmpty()) { addInEmptyList(e); return; } Element<E> n = new Element<>(e); n.next = first; first.prev = n; first = n; sizeList++; } //Метод добавляет элемент в конец списка public void addLast(E e) { if (isEmpty()) { addInEmptyList(e); return; } Element<E> n = new Element<>(e); last.next = n; n.prev = last; last = n; sizeList++; } //Метод возвращает первый элемент списка public E getFirst() { if (isEmpty()) return null; return first.content; } //Метод возвращает последний элемент списка public E getLast() { if (isEmpty()) return null; return last.content; } //Метод возвращает произвольный элемент списка public E get(int i) { if (isEmpty()) throw new IndexOutOfBoundsException(); if ((i < 0) | (i >= sizeList)) throw new IndexOutOfBoundsException(); int j = -1; for (E e : this) { j++; if (j == i) return e; } return null; } //Метод устанавливает новое значение произвольному элементу списка public void set(E e, int i) { if (isEmpty()) throw new IndexOutOfBoundsException(); if ((i < 0) | (i >= sizeList)) throw new IndexOutOfBoundsException(); Element<E> current = first; int j = 0; while (current!=null){ if (j==i){ current.content=e; return; } j++; current=current.next; } } //Метод возвращает произвольный элемент из списка, удаляя его. Если список пуст - возвращается null public E remove(int i) { if (isEmpty()) throw new IndexOutOfBoundsException(); if ((i < 0) | (i > (size() - 1))) throw new IndexOutOfBoundsException(); if (i == 0) { return removeFirst(); } if (i == (size() - 1)) { return removeLast(); } Element<E> current = first; int j = 0; while (j != i) { j++; current = current.next; } Element<E> n = current.next; Element<E> p = current.prev; p.next = n; n.prev = p; sizeList--; return current.content; } //Метод возвращает первый элемент из списка, удаляя его. Если список пуст - возвращается null public E removeFirst() { if (isEmpty()) return null; E n = first.content; if (first == last) { first = null; last = null; } else first = first.next; if (first != null) first.prev = null; sizeList--; return n; } //Метод возвращает последний элемент из списка, удаляя его. Если список пуст - возвращается null public E removeLast() { if (isEmpty()) return null; E n = last.content; if (last == first) { last = null; first = null; } else last = last.prev; if (last != null) last.next = null; sizeList--; return n; } //Метод возвращает размер списка public int size() { return sizeList; } //Метод возвращает true, если список пуст public boolean isEmpty() { return sizeList == 0; } //Метод очищает список public void clear() { first = null; last = null; sizeList = 0; } @Override public Iterator<E> iterator() { return new Iterator<E>() { private Element<E> current = first; @Override public boolean hasNext() { return current != null; } @Override public E next() { E n = current.content; current = current.next; return n; } }; } @Override public String toString() { String s = "[ "; for (E e : this) s += e.toString() + " "; s += "]"; return s; } }