链表反转递归算法的思想
思想:以相似的方法重复,类似与树结构,先从根节点找到叶子节点,从叶子节点开始遍历大的问题(整个链表反转)拆成性组相同的小问题(两个元素反转)curr.next.next = curr 将所有的小问题解决,大问题即解决
只需每个元素都执行curr.next.next = curr,curr.next = null两个步骤即可为了保证链不断,必须从最后一个元素开始
递归实现的算法代码案例
package com.hx;
public class ReverseList {
static class ListNode{
int val;
ListNode next;
public ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
}
//递归
public static ListNode recursion(ListNode curr) {
if(null == curr || null == curr.next) { //表示curr已经是最后以后元素了
return curr;
}
ListNode newCurr = recursion(curr.next);
curr.next.next = newCurr;
curr.next = null;
return newCurr;
}
}
算法测试代码
package com.hx;
public class Test {
public static void main(String[] args) {
ReverseList.ListNode node10 = new ReverseList.ListNode(10,null);
ReverseList.ListNode node9 = new ReverseList.ListNode(9,node10);
ReverseList.ListNode node8 = new ReverseList.ListNode(8,node9);
ReverseList.ListNode node7 = new ReverseList.ListNode(7,node8);
ReverseList.ListNode node6 = new ReverseList.ListNode(6,node7);
ReverseList.ListNode node5 = new ReverseList.ListNode(5,node6);
ReverseList.ListNode node4 = new ReverseList.ListNode(4,node5);
ReverseList.ListNode node3 = new ReverseList.ListNode(3,node4);
ReverseList.ListNode node2 = new ReverseList.ListNode(2,node3);
ReverseList.ListNode node1 = new ReverseList.ListNode(1,node2);
ReverseList.ListNode iterate = ReverseList.recursion(node10.next);
System.out.println(iterate);
}
}
算法测试结果