原创转载请注明出处:http://agilestyle.iteye.com/blog/2360694
Recursive Idea
Reverse(Head -> Remaining List)
=>
Reverse(Remaining List) -> Head
Example:
Reverse(1->2->3->4->5)
=>
Reverse(2->3->4->5) -> 1
Demo
package org.fool.java.collections;
public class ReverseLinkedListTest {
public static void main(String[] args) {
List l = new List(1);
l.next = new List(2);
l.next.next = new List(3);
l.next.next.next = new List(4);
l.next.next.next.next = new List(5);
System.out.println("Original List: " + l.toString());
l = reverse(l);
System.out.println("Reversed List: " + l.toString());
}
public static List reverse(List l) {
// firstly check if l is empty or only has one element then return
if (l == null || l.next == null) {
return l;
}
// otherwise, use recursive method to process
List remainingReverse = reverse(l.next);
// step 1: need to update the tail of remaining reverse as head l
l.next.next = l; // this (l.next) is the key to get the tail in constant time
// set l.next to NULL after that! Otherwise it's causing cycles in list
l.next = null;
// step 2: return the reverse list
return remainingReverse;
}
}
class List {
int value;
List next;
public List(int value) {
this.value = value;
}
@Override
public String toString() {
List current = this;
String output = "";
while (current != null) {
output += current.value + " -> ";
current = current.next; // increment the pointer index current
}
return output + "NULL";
}
}
Note:
Console Output
Reference
https://www.youtube.com/watch?v=j5m6rRszzEQ&list=PLlhDxqlV_-vkak9feCSrnjlrnzzzcopSG