Ниже приведен метод реверсирования связанного списка.
Обратный метод
public void reverseList() {
Node<E> curr = head;
Node<E> pre = null;
Node<E> incoming = null;
while(curr != null) {
incoming = curr.next; // store incoming item
curr.next = pre; // swap nodes
pre = curr; // increment also pre
curr = incoming; // increment current
}
head = pre; // pre is the latest item where
// curr is null
}
Для реверсирования списка необходимы три ссылки: pre, curr, incoming.
... pre curr incoming
... --> (n-1) --> (n) --> (n+1) --> ...
Чтобы изменить узел, вам нужно сохранить предыдущийэлемент, чтобы вы могли использовать простой оператор;
curr.next = pre;
Чтобы изменить направление текущего элемента. Однако для итерации по списку вы должны сохранить входящий элемент до выполнения приведенного выше оператора, потому что при реверсировании следующей ссылки текущего элемента вы больше не знаете входящий элемент, поэтому нужна третья ссылка.
Демонстрационный код показан ниже;
Образец класса LinkedList
public class LinkedList<E> {
protected Node<E> head;
public LinkedList() {
head = null;
}
public LinkedList(E[] list) {
this();
addAll(list);
}
public void addAll(E[] list) {
for(int i = 0; i < list.length; i++)
add(list[i]);
}
public void add(E e) {
if(head == null)
head = new Node<E>(e);
else {
Node<E> temp = head;
while(temp.next != null)
temp = temp.next;
temp.next = new Node<E>(e);
}
}
public void reverseList() {
Node<E> curr = head;
Node<E> pre = null;
Node<E> incoming = null;
while(curr != null) {
incoming = curr.next; // store incoming item
curr.next = pre; // swap nodes
pre = curr; // increment also pre
curr = incoming; // increment current
}
head = pre; // pre is the latest item where
// curr is null
}
public void printList() {
Node<E> temp = head;
System.out.print("List: ");
while(temp != null) {
System.out.print(temp + " ");
temp = temp.next;
}
System.out.println();
}
public static class Node<E> {
protected E e;
protected Node<E> next;
public Node(E e) {
this.e = e;
this.next = null;
}
@Override
public String toString() {
return e.toString();
}
}
}
Тестовый код
public class ReverseLinkedList {
public static void main(String[] args) {
Integer[] list = { 4, 3, 2, 1 };
LinkedList<Integer> linkedList = new LinkedList<Integer>(list);
linkedList.printList();
linkedList.reverseList();
linkedList.printList();
}
}
Выход
List: 4 3 2 1
List: 1 2 3 4
person
Levent Divilioglu
schedule
28.03.2016