反转单链表算法详解 | 刷题打卡

158 阅读2分钟

今天写一篇有关『单链表』的经典面试题-反转链表,本人在百度 字节的面试中遇到过,题目属于easy的级别,虽然简单,但是更需要掌握😊

题目描述:

输入一个链表,反转链表后,输出新链表的表头。

输入:{1, 2, 3}

返回:{3, 2, 1}

思路分析

链表反转的核心在于头插法,掌握头插法就掌握了这道题目

另外要注意的就是看题目是否要求不能破坏原链表,如果要求不能破坏,那么要申请新的空间

可以借助额外的空间来实现,初始化一个值为-1的头指针,然后遍历链表,采用头插法完成链表反转

有的面试官比较严格,会要求不借助额外的空间,那么就采用变量记录原链表头的位置就可以了

AC代码实现

  • 借助额外的链表头实现
function ListNode(x){
    this.val = x;
    this.next = null;
}
function ReverseList(pHead)
{
    // write code here
    if (pHead == null || pHead.next == null) {
        return pHead;
    }

    let head = new ListNode(-1);
    let p = pHead, pNxt;

    while (p != null) {
        pNxt = p.next;
        p.next = head.next;
        head.next = p;
        p = pNxt;
    }

    return head.next;
}
  • 不借助额外链表头,在原链表上实现反转
function ReverseList(pHead)
{
    // write code here
    if (pHead == null || pHead.next == null) {
        return pHead;
    }

    let head = pHead, pHeadNxt = pHead.next;
    pHead = pHeadNxt;
    head.next = null;

    while (pHead != null) {
        pHeadNxt = pHead.next;
        pHead.next = head;
        head = pHead;
        pHead = pHeadNxt;
    }

    return head;
}

总结

链表是面试中常考的算法题,对于链表的考察,反转链表是常见的题目。对于常见算法题,要熟悉解题思路,掌握关键点,这样在面试中才会有把握。

链表反转还可以通过递归的方式来实现,代码比较简洁,有兴趣的可以自己实现一下。

如果这篇文章对你有帮助,就点赞 关注

本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情