@booogabooo

Как работает данный алгоритм?

Есть такой код для двусвязного списка. На вход подаем сам список, и элемент, который нужно махнуть со следующим.
Но по какому принципу происходит вот это "махнуть" - не понимаю
public static Node reverseMyList (Node c,int n) { 
	        String temp = "";
	        current = new Node("Новый список:");
	        count = 0;
	        
	       while( c != null ) { 
	            temp += c.inf+ " "; 
	            c = c.next;
	        }; 
	        
	        String[]tt = temp.split(" ");
	        for(int i = 0; i < tt.length / 2; i++){
	           String y = tt[i];
	           tt[i] = tt[tt.length - i - 1];
	           tt[tt.length - i - 1] = y;
	        }
	        n = tt.length - 3 - n;
	        while(count != tt.length - 2){
	            if(n != count){
	                Node e = new Node (tt[count]); 
	                Node old = current.next; 
	                e.next = old; // добавить элемент
	                current.next = e; 
	            }
	            if(n == count){
	                Node e = new Node (tt[count + 1]); 
	                Node old = current.next; 
	                e.next = old; 
	                current.next = e; 
	                addNode(current,tt[count]);            
	            }
	            count++; 
	            int tn = 0;
	        }
	        return current;
	}


код дерьмоват - но это не суть...
  • Вопрос задан
  • 366 просмотров
Решения вопроса 2
NTP
@NTP
Алфавитный быть во всем должен порядок!
Приведенный код требует полного, абсолютного, тотального, всеобъемлющего и исчерпывающего рефакторинга... Если нужно "махнуть" элемент со следующим, то достаточно:
1. Перейти по списку до текущего элемента
2. Создать буфер под данные в текущем списке
3. Скопировать данные из текущего элемента в буфер
4. Скопировать данные из следующего элемента в предыдущий
5. Скопировать данные из буфера в следующий элемент
6. (опционально) Удалить буфер
Это решение "в лоб" и далеко не оптимально, но, учитывая качество кода, говорить о перелинковке элементов считаю излишним.
Ответ написан
Комментировать
Mrrl
@Mrrl
Заводчик кардиганов
Страшноватый алгоритм...
Сначала создаём строку, содержащую всю информацию из списка (то есть, нас вообще не волнует, что где-то была структура "список" - мы его убиваем, чтобы потом построить заново из сырых данных)...
Потом превращаем строку в массив из строк! С помощью Split, разделяя её по пробелам!!! Зачем? Почему сразу не заполнить массив строк? А если строки в списке будут сами содержать пробелы, как "Новый список:"?
Потом разворачиваем этот массив! Зачем? А потому, что нас не научили вставлять элементы в конец списка, мы можем вставить их только в начало. Проходить массив в обратном порядке, вероятно, тоже не умеем.
Потом, уже при построении списка, у нас вызывается загадочная функция addNode(). Что она делает - неизвестно, поскольку, если бы она вставляла новый элемент после current - её бы вызвали ещё в двух местах кода, а не писали бы её код в развёрнутом виде.
И, наконец, независимо от того, что делает addNode(), элемент tt[n+1] будет вставлен в список дважды.
static Node SwapFirst(Node c) {
    if(c==null || c.next==null) return c;
    Node result=c.next;
    c.next=result.next;
    result.next=c;
    return result;
}
public static Node reverseMyList (Node c,int n) {
   if(n==0) return SwapFirst(c);
   Node d=c;
   for(;n>1 && d.next!=null;n--) d=d.next;
   if(n==1) d.next=SwapFirst(d.next);
   return c;
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Есть такой код для двусвязного списка.

Ошибка здесь: этот код для однозвязного списка.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы