反转单链表递归实现

package org.zl.test.caculateMethod;

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

    public static class LinkedList{
        public Node head;
        public Node tail;
        
        public LinkedList add(Node node){
            if (head == null) {
                head = node;
            } else {
                tail.next = node;
            }
            tail = node;
            return this;
        }
        
        /**
         * 递归实现链表反转
         * @param currentNode
         * @return
         */
        public Node reverse(Node currentNode) {
            if (currentNode == null) {
                return null;
            }
            if (currentNode.next == null) {
                this.head = currentNode;
                return head;
            }
            Node 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 currentNode = head;
            while(currentNode != null) {
                sb.append(currentNode.data).append(',');
                currentNode = currentNode.next;
            }
            return sb.toString();
        }
    }
    
    public static void main(String[] args) {
        LinkedList linkedList = new LinkedList();
        for(int i=1;i<=50;i++) {
            linkedList.add(new Node(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(-1));
        linkedList.add(new Node(-2));
        linkedList.add(new Node(-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,

 

你可能感兴趣的:(反转单链表递归实现)