剑指 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;  //返回反转链表的头节点
    }
posted @ 2021-02-03 16:06  your_棒棒糖  阅读(32)  评论(0)    收藏  举报