JAVA实现单链表头插法原地逆置

/**
 * 两种方式(递归和非递归)实现单链表原地逆置
 * leetcode #206
 */
public class Reverse {
    class Node{
        int value;
        Node next;
        Node(int x){
            value = x;
        }
    }
    //非递归,双指针,头插法
    public Node reverse1(Node head){
        if(head == null || head.next == null){
            return head;
        }

        //p存储第一个元素,r用于p与后面链表断开时临时存储后面元素
        Node p = head.next, r;
        //头节点断开
        head.next = null;
        while (p != null) {
            //r临时存储后边的元素,因为p要与后边的断开
            r = p.next;
            //p与后面断开,且指向头节点后边的元素
            p.next = head.next;
            //头节点与p相连,p插入到头节点与先来的元素之间
            head.next = p;
            //后移一个,继续逆置
            p = r;
        }
        return head;
    }

    public Node reverse2(Node head){
        if(head == null || head.next == null){
            return head;
        }
        
        //递归到链表末尾,走上面的递归出口最后一个元素直接通过return head 得到
        //然后返回到倒数第二层执行最后三行代码,依次得到逆置的元素
        //可以根据下图帮助理解
        Node newHead = reverse2(head.next);
        head.next.next = head;
        head.next = null;
        return newHead;
    }
}

JAVA实现单链表头插法原地逆置_第1张图片

你可能感兴趣的:(后端java链表)