Основы объектно-ориентированного программирования
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]).
