反转链表(不改变指针)JAVA版

class ListNode {
    int val;
    ListNode next;
    ListNode(int x) {
        val = x;
        next = null;
    }
}

public class Solution {

    private ListNode left;        //java不支持c++的LinkedList &*p这种方式,所以用member variable来存放left
    private boolean alreadyDone = false;
    
    public void reverseLinkedList(ListNode head) {
        if (null == head)
            return;
        
        left = head;
        reverseLinkedListCore(head);
    }
    
    private void reverseLinkedListCore(ListNode right) {
        if (null == left || null == right)
            return;
        
        reverseLinkedListCore(right.next);            //先不停递归,直至right走到最右
        
        if (alreadyDone)                            //边界条件
            return;
        
        if (left == right || right.next == left) {    //边界条件  前者针对奇数长度的链表,后者针对偶数
            alreadyDone = true;
            return;
        }
        
        int tmp = left.val;                            //交换部分
        left.val = right.val;
        right.val = tmp;
        left = left.next;                            //left往右走一步,然后把跳出一次递归,让right往左走一步
    }
    
    public static void main(String[] args) {
        ListNode a = new ListNode(1);
        ListNode b = new ListNode(2);
        ListNode c = new ListNode(3);
        ListNode d = new ListNode(4);
        ListNode e = new ListNode(5);
        ListNode f = new ListNode(6);
        ListNode g = new ListNode(7);
        
        a.next = b;
        b.next = c;
        c.next = d;
        d.next = e;
        e.next = f;
        f.next = g;
        
        Solution sl = new Solution();
        sl.reverseLinkedList(a);
        while (null != a) {
            System.out.print(a.val + " -> ");
            a = a.next;
        }
    }
}
原文地址:https://www.cnblogs.com/lihaozy/p/3208103.html