Как работает данный алгоритм?
Приведенный код требует полного, абсолютного, тотального, всеобъемлющего и исчерпывающего рефакторинга... Если нужно "махнуть" элемент со следующим, то достаточно:
1. Перейти по списку до текущего элемента
2. Создать буфер под данные в текущем списке
3. Скопировать данные из текущего элемента в буфер
4. Скопировать данные из следующего элемента в предыдущий
5. Скопировать данные из буфера в следующий элемент
6. (опционально) Удалить буфер
Это решение "в лоб" и далеко не оптимально, но, учитывая качество кода, говорить о перелинковке элементов считаю излишним.
Страшноватый алгоритм...
Сначала создаём строку, содержащую всю информацию из списка (то есть, нас вообще не волнует, что где-то была структура "список" - мы его убиваем, чтобы потом построить заново из сырых данных)...
Потом превращаем строку в массив из строк! С помощью 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;
}