您的位置:首页 > 编程语言 > Java开发

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

2013-07-23 11:10 471 查看
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;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: