Реверсивный связанный список в Java - PullRequest
97 голосов
/ 10 декабря 2008

Я уже некоторое время работаю над проектом Java для класса. Это реализация связанного списка (здесь называемого AddressList, содержащего простые узлы с именем ListNode). Суть в том, что все должно быть сделано с помощью рекурсивных алгоритмов. Я был в состоянии сделать все отлично без одного метода: public AddressList reverse()

ListNode:

public class ListNode{
  public String data;
  public ListNode next;
}

Прямо сейчас моя reverse функция просто вызывает вспомогательную функцию, которая принимает аргумент для разрешения рекурсии.

public AddressList reverse(){
  return new AddressList(this.reverse(this.head));
}

С моей вспомогательной функцией, имеющей подпись private ListNode reverse(ListNode current).

В данный момент у меня он работает итеративно с использованием стека, но это не то, что требует спецификация. Я нашел алгоритм в C, который рекурсивно обращал и преобразовывал его в код Java вручную, и он работал, но я не понимал его.

Редактировать: Неважно, я понял это в то же время.

private AddressList reverse(ListNode current, AddressList reversedList){
  if(current == null) 
      return reversedList;
  reversedList.addToFront(current.getData());
  return this.reverse(current.getNext(), reversedList);
}

Пока я здесь, кто-нибудь видит проблемы с этим маршрутом?

Ответы [ 32 ]

0 голосов
/ 26 мая 2017
public void reverseLinkedList(Node node){
    if(node==null){
        return;
    }

    reverseLinkedList(node.next);
    Node temp = node.next;
    node.next=node.prev;
    node.prev=temp;
    return;
}
0 голосов
/ 26 октября 2013
public void reverse(){
    if(isEmpty()){
    return;
     }
     Node<T> revHead = new Node<T>();
     this.reverse(head.next, revHead);
     this.head = revHead;
}

private Node<T> reverse(Node<T> node, Node<T> revHead){
    if(node.next == null){
       revHead.next = node;
       return node;
     }
     Node<T> reverse = this.reverse(node.next, revHead);
     reverse.next = node;
     node.next = null;
     return node;
}
...