原创转载请注明出处: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