#алгоритм #структуры_данных
Здравствуйте. Довольно часто на собеседованиях или же в тестовых заданиях (для прохождения на стажировку, например) задается вопрос об односвязных списках. Например, дают задачу, в которой необходимо развернуть односвязный список за О(n) времени. Так вот, как это сделать? Можно ли просто переопределить ссылки? Т.е. сделать за 1 итерацию так, чтобы не A->B, а A<-B ? Можете, пожалуйста, привести пример? Заранее благодарю
Ответы
Ответ 1
Первая ссылка из гугла. void reverse(OneWayList list){ OneWayList.Node node = list.head; OneWayList.Node previous = null; while(node != null){ //next item OneWayList.Node tmp = node.next; //swap items node.next = previous; previous = node; list.head = node; //next item node = tmp; } } ОтсюдаОтвет 2
Ну так становитесь на первый элемент, и идя по списку, у каждого разворачиваете указатель на предыдущий узел, из которого вы только что пришли. Понятно, что у самого первого указатель обнуляется, а заголовок списка теперь указывает на узел, который был последним. Вот и O(n).
Комментариев нет:
Отправить комментарий