Eсть два способа мышления о связанном списке, когда он пришел, чтобы сигнализировать о конце списка (что в основном относится к пустым спискам)
Первый заключается в том, чтобы установить узел в нуль. После этого, когда вы делаете действие в списке (добавьте, удалите, итерации), вы можете проверить, является ли оно нулевым, прежде чем идти дальше.
Второй - использовать специальный объект (называемый дозорным), который используется как флаг вместо нуля , Это может быть особый узел, который, когда вы получаете данные от него, генерирует исключение. Преимущество состоит в том, что вам не нужно управлять нулевым значением во всем методе, но, возможно, придется управлять исключением.
В случае двойного связанного списка, это точно так же, только изменение содержимого узла (у вас есть обратный указатель, который добавляется)
В случае хвоста ссылки, вы добавляете указатель в вас список класса, сохраняйте ссылку на хвост списка, поэтому вы управляете им как главный указатель, изначально он является нулевым или с объектом флага, и когда первый объект добавляется в список, обе ссылки будут обновляться на том же узле.
В случае кругового списка он по-прежнему остается неизменным для инициализации, а затем, когда вы добавляете первый объект, вы одновременно привязываете его к нему.
например:
public class List<T extends Comparable<T>> implements Iterable<T> {
private class Node<D extends Comparable<D>> {
private D data;
private Node<D> next;
}
Node firstNode;
public List(){
firstNode=null;
}
// other methods
}
Не могли бы вы явно показать мне, как я установить узел в нуль в моем конструкторе? –
ну, это просто переменное назначение, но я добавляю его к своему ответу. –
Oooh. Как насчет второго варианта, который вы упомянули? –