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; } } }