Основы объектно-ориентированного программирования
L2-список — линейный двусвязный список — можно представлять себе в виде перекидного календаря или бус, нанизанных на нить. Для списка определены его начало и конец, а также указатель. Указатель всегда находится между элементами списка (в случае перекидного календаря указателю соответствует то место, на котором календарь раскрыт). Графическая иллюстрация L2-списка представлена на рис. 10.4.
Как это видно из приведенного ниже интерфейса, добавление или удаление элементов из списка возможно только рядом с указателем (для того, чтобы вынуть лист из календаря, надо раскрыть его на нужном месте).
Пример интерфейса
interface L2List { // Пуст ли список? boolean empty(); // Сделать список пустым. void clear(); // Передвинуть указатель в начало списка. void toFront(); // Передвинуть указатель в конец списка. void toBack(); // Указатель в начале списка? boolean begin(); // Указатель в конце списка? boolean end(); // Передвинуть указатель вперед. void forward() throws Exception; // Передвинуть указатель назад. void backward() throws Exception; // Получить число за указателем; int after() throws Exception; // Получить число перед указателем; int before() throws Exception; // Добавить число за указателем; void insertBack(int val); // Добавить число перед указателем; void insertFront(int val); // Удалить число за указателем. int eraseBack() throws Exception; // Удалить число перед указателем. int eraseFront() throws Exception; }
Попытки передвинуть указатель за начало или конец списка или извлечь элемент из пустого списка приводят к возникновению исключительной ситуации.
L1-список — линейный односвязный список отличается от L2-списка тем, что двигаться по нему можно только в одном направлении (календарь не разрешается листать назад), а вставлять и удалять элементы — только за указателем.
Пример интерфейса
interface L1List { // Пуст ли список? boolean empty(); // Сделать список пустым. void clear(); // Передвинуть указатель в начало списка. void toFront(); // Указатель в конце списка? boolean end(); // Передвинуть указатель вперед. void forward() throws Exception; // Получить число за указателем; int after() throws Exception; // Добавить число за указателем; void insert(int val); // Удалить число за указателем. int erase() throws Exception; }
Исключительные ситуации при работе с односвязным списком возникают по тем же причинам, что и для двусвязного списка.
Простое и понятное описание интерфейсов всех рассмотренных выше типов содержится в первой главе учебного пособия [9]. Для получения более полной информации по рассмотренным вопросам можно обратиться к описанию стандартных контейнеров библиотеки языка C++ (книга [12]) и описанию пакета java.util (книги [11] и [13]).