剑指 Offer 24 . 反转链表 —— 迭代、递归
剑指 Offer 24. 反转链表
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
方法一:迭代(双指针)
考虑遍历链表,并在访问各节点时修改 next 引用指向
//迭代
public ListNode reverseList(ListNode head) {
ListNode cur = head,pre = null;
while (cur != null){
ListNode temp = cur.next; //暂存后继节点cur.next
cur.next = pre; //修改next引用指向
pre = cur; //pre暂存cur
cur = temp; //cur访问下一节点
}
return pre;
}
方法二:递归
考虑使用递归法遍历链表,当越过尾节点后终止递归,在回溯时修改各节点的 next 引用指向。
recur(cur, pre) 递归函数:
终止条件:当 cur 为空,则返回尾节点 pre (即反转链表的头节点);
递归后继节点,记录返回值(即反转链表的头节点)为 res ;
修改当前节点 cur 引用指向前驱节点 pre ;
返回反转链表的头节点 res ;
reverseList(head) 函数:
调用并返回 recur(head, null) 。传入 null 是因为反转链表后, head 节点指向 null ;
//递归
public ListNode reverseList(ListNode head){
return recur(head,null); //调用递归并返回
}
private ListNode recur(ListNode cur, ListNode pre) {
if (cur == null) return pre; // 终止条件
ListNode res = recur(cur.next, pre); //递归后继节点
cur.next = pre; //修改节点应用指向
return res; //返回反转链表的头节点
}