反转单链表递归实现

package org.zl.test.caculateMethod;

public class ReverseLinkedList {
    
    public static class Node<T>{
        public T data;
        public Node<T> next;
        public Node(T data) {
            super();
            this.data = data;
        }
        @Override
        public String toString() {
            return "Node [data=" + data + ", next=" + next + "]";
        }
    }

    public static class LinkedList<T>{
        public Node<T> head;
        public Node<T> tail;
        
        public LinkedList<T> add(Node<T> node){
            if (head == null) {
                head = node;
            } else {
                tail.next = node;
            }
            tail = node;
            return this;
        }
        
        /**
         * 递归实现链表反转
         * @param currentNode
         * @return
         */
        public Node<T> reverse(Node<T> currentNode) {
            if (currentNode == null) {
                return null;
            }
            if (currentNode.next == null) {
                this.head = currentNode;
                return head;
            }
            Node<T> pred = reverse(currentNode.next);
            currentNode.next = null;
            pred.next = currentNode;
            this.tail = currentNode;
            return currentNode;
        }
        
        
        @Override
        public String toString() {
            StringBuilder sb = new StringBuilder();
            if (head == null) {
                return sb.toString();
            }
            Node<T> currentNode = head;
            while(currentNode != null) {
                sb.append(currentNode.data).append(',');
                currentNode = currentNode.next;
            }
            return sb.toString();
        }
    }
    
    public static void main(String[] args) {
        LinkedList<Integer> linkedList = new LinkedList<Integer>();
        for(int i=1;i<=50;i++) {
            linkedList.add(new Node<Integer>(i));
        }
        System.out.println("转换前:"+linkedList.toString());
        linkedList.reverse(linkedList.head);
        System.out.println("转换后:"+linkedList.toString());
        System.out.println("转换后linkedList的尾节点是:"+linkedList.tail);
        linkedList.add(new Node<Integer>(-1));
        linkedList.add(new Node<Integer>(-2));
        linkedList.add(new Node<Integer>(-3));
        System.out.println("转换后添加的尾节点是:"+linkedList.toString());
    }
    
}

执行结果:

转换前:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,
转换后:50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,
转换后linkedList的尾节点是:Node [data=1, next=null]
转换后添加的尾节点是:50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,-1,-2,-3,
原文地址:https://www.cnblogs.com/swave/p/11338744.html