На днях в локальной группе .NET я пришел к следующему вопросу: «Является ли вопрос правильного собеседования о Linked Lists при найме кого-то для позиции разработки .NET?»Связанный список Design
Не имея степени в области информатики и будучи самообразованным разработчиком, мой ответ был таким, что я не чувствовал, что это уместно, поскольку я через 5 лет развивается с .NET, никогда не подвергался связанным спискам и не слышал никаких убедительных причина использования для одного.
Однако человек отметил, что это очень распространенный вопрос для интервью, поэтому я решил, что когда я уйду, я сделаю некоторое повторное исследование связанных списков и посмотрю, чего я могу потерять.
Я прочитал несколько сообщений о переполнении стека и различных поисковых запросах Google и решил, что лучший способ узнать о них - это написать мои собственные классы .NET, чтобы увидеть, как они работают изнутри.
Вот мой класс структура
один список
Конструктор
public SingleLinkedList(object value);
// Public Properties
public bool IsTail;
public bool IsHead;
public object Value;
public int Index;
public int Count;
// private fields not exposed to a property
private SingleNode firstNode;
private SingleNode lastNode;
private SingleNode currentNode;
Методы
public void MoveToFirst();
public void MoveToLast();
public void Next();
public void MoveTo(int index);
public void Add(object value);
public void InsertAt(int index, object value);
public void Remove(object value);
public void RemoveAt(int index);
Вопросы у меня есть:
Каковы типичные методы, которые вы ожидаете в связанном списке?
Что такое типичное поведение при добавлении новых записей? Например, если у меня есть 4 узла, и я сейчас размещен во втором узле и выполняю Add(), должен ли он быть добавлен после или до текущего узла? Или он должен быть добавлен в конец списка?
Некоторые из конструкций, которые я видел, объясняя вещи, кажется, выставляют за пределами класса LinkedList объект Node. В моем проекте вы просто добавляете, получаете, удаляете значения и ничего не знаете об объекте узла.
Должны ли Head and Tail быть объектами-заполнителями, которые используются только для определения головы/хвоста списка?
Мне требуется, чтобы мой связанный список создавался с помощью значения, которое создает первый узел списка, который по существу является головкой и хвостом списка. Вы бы это изменили?
Какими должны быть правила, когда дело касается удаления узлов. Должен ли кто-нибудь удалить все узлы?
Вот мой двойной Связанный список
Конструкторы
public DoubleLinkedList(object value);
Свойства
public bool IsHead;
public bool IsTail;
public object Value;
public int Index;
public int Count;
Частные поля не подвержены через свойство
private DoubleNode currentNode;
Методы
public void AddFirst(object value);
public void AddLast(object value);
public void AddBefore(object existingValue, object value);
public void AddAfter(object existingValue, object value);
public void Add(int index, object value);
public void Add(object value);
public void Remove(int index);
public void Next();
public void Previous();
public void MoveTo(int index);
Почему бы не сделать его общим? –
Это смешно, я подумал о добавлении комментария в свой пост, что я мог бы сделать его общим, но я просто играл вокруг и не искал удобство использования. Скорее просто пытайтесь понять связанные списки и какие методы/поведение они должны иметь. Как только я получу какую-то обратную связь, я закончу свои занятия и, скорее всего, реорганизую тогда, чтобы использовать дженерики, на которые вы намекали. –
@ Jim: для создания родового требуется только минимальная дополнительная работа, но это проще сделать заранее, а не переписывать все ваши подписи. – Brian