反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL
递归
// 返回值为新链表的头节点
public ListNode reverseList(ListNode head) {
if(head==null || head.next==null)
return head;
ListNode newHead = reverseList(head.next);
//上一步已经将head之后的节点全部翻转了,只需要更新当前节点的next指向
head.next.next = head;
head.next = null;
return newHead;
}
非递归
需要由pre,cur,next保存节点值,便于翻转。
public ListNode reverseList(ListNode head) {
ListNode pReversedHead = null;
ListNode cur = head;
ListNode pre = null;
while (cur!=null){
ListNode next = cur.next;
if(next == null)
pReversedHead = cur;
cur.next = pre;
pre = cur;
cur = next;
}
return pReversedHead;
}