首先定义单向链表
public class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}
示例:单向链表 1 -> 2 -> 3 -> 4 -> 5
反转后为 5 -> 4 -> 3 -> 2 -> 1
我这里采用递归法:
按上面的示例来说,我们把链表分成两个部分,已反转部分
和 待反转部分
;因为将一个结点添加到链表的两端是很简单的,这样我们每次从待反转部分
取出头结点添加已反转部分
的头部,直至待反转部分
为null则反转完成。
反转过程表示如下:
已反转 待反转
null 1->2->3->4->5
1 2->3->4->5
2->1 3->4->5
3->2->1 4->5
4->3->2->1 5
5->4->3->2->1 null
实现函数:
public ListNode reverse(ListNode reversed, ListNode needReverse){
if(needReverse == null){
return reversed;
}
ListNode tmp = needReverse;
needReverse = needReverse.next;
tmp.next = reversed;
return reverse(tmp, needReverse);
}
调用时reversed参数传null就行了,因为函数开始执行时还没有做反转操作呢!