剑指 Offer 24. 反转链表

剑指 Offer 24. 反转链表

定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。

示例:

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

限制:

0 <= 节点个数 <= 5000

一、迭代

算法思路:

首先把cur设置到头节点,pre设置到null的位置。

然后在遍历链表

设置一个ListNode tmp 用来暂存cur.next的后继节点

然后在修改cur.next指向到pre

示例:1<-2->3->4->5->null

再把pre暂存到cur

1<-2(暂存在这)->3->4->5->null

class Solution {
    public ListNode reverseList(ListNode head) {
        ListNode cur = head, pre = null;
        while (cur != null) {
            ListNode tmp = cur.next; //暂存cur.next后继节点
            cur.next = pre;//修改cur.next的指向,就可以实现反转了
            pre = cur;//pre暂存cur
            cur = tmp;//cur开始下一节点
        }
        return pre;
    }
}

二、递归

class Solution {
    public ListNode reverseList(ListNode head) {
        return recur(head, null);
    }

    public ListNode recur(ListNode cur, ListNode pre) {
        if (cur == null) return pre;//如果cur为null时,则终止条件
        ListNode res = recur(cur.next, cur);//recur(1,null) recur(2,1) ...... recur(null,5)
        cur.next = pre;//修改cur.next的指向,指向pre,实现反转
        return res;//返回反转链表的头节点
    }
}
posted @ 2021-08-06 17:42  RainsX  阅读(30)  评论(0)    收藏  举报