干丫的算法之反转链表(2)

238 阅读1分钟

算法薄弱,每天一道算法题,突破自己

题目

反转一个单链表,使用迭代递归两种方法

示例:

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

解析

迭代解析:

创建三个变量pre,cur,next代表上一个,当前,下一个。
每次迭代将指向交换

var reverseList1 = function(head) {
    // 迭代
    let cur = head;
    let pre = null;
    while (cur != null) {
        const next = cur.next;
        cur.next = pre;
        pre = cur;
        cur = next;
    }

    return pre;
}

递归解析:注意使用了尾递归

var reverseList2 = function(head) {
    // 递归
    if (head === null || head.next === null) return head;
    head = reverse(null, head);

    return head;
}

function reverse(pre, cur) {
    if (!cur) return pre;
    const next = cur.next;
    cur.next = pre;
    return reverse(cur, next);
}