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