美文网首页Java架构技术进阶
热门的算法面试题你都不知道?链表反转的两种实现方法,后一种击败了

热门的算法面试题你都不知道?链表反转的两种实现方法,后一种击败了

作者: 今天你敲代码了吗 | 来源:发表于2020-10-13 22:10 被阅读0次

前言

链表反转是一道很基础但又非常热门的算法面试题,它也在《剑指Offer》的第 24 道题出现过,至于它有多热(门)看下面的榜单就知道了。

从牛客网的数据来看,链表反转的面试题分别霸占了【上周考过】和【研发最爱考】的双重榜单,像网易、字节等知名互联网公司都考过,但通过率却低的只有 30%,所以本文我们就来学习一下反转链表的两种实现方法。

题目

标题:剑指 Offer 24. 反转链表

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

示例:

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

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

实现方式一:Stack


因为栈是先进后出的数据结构,因此它的执行过程如下图所示:

最终的执行结果如下图所示: [图片上传中...(image-14c33c-1602596611413-7)]

实现代码如下所示:

public ListNode reverseList(ListNode head) {
    if (head == null) return null;
    Stack<ListNode> stack = new Stack<>();
    stack.push(head); // 存入第一个节点
    while (head.next != null) {
        stack.push(head.next); // 存入其他节点
        head = head.next; // 指针移动的下一位
    }
    // 反转链表
    ListNode listNode = stack.pop(); // 反转第一个元素
    ListNode lastNode = listNode; // 临时节点,在下面的 while 中记录上一个节点
    while (!stack.isEmpty()) {
        ListNode item = stack.pop(); // 当前节点
        lastNode.next = item;
        lastNode = item;
    }
    lastNode.next = null; // 最后一个节点赋为null(不然会造成死循环)
    return listNode;
}

LeetCode 验证结果如下图所示:

实现方式二:递归

实现代码如下所示:

public static ListNode reverseList(ListNode head) {
    if (head == null || head.next == null) return head;
    // 从下一个节点开始递归
    ListNode reverse = reverseList(head.next);
    head.next.next = head; // 设置下一个节点的 next 为当前节点
    head.next = null; // 把当前节点的 next 赋值为 null,避免循环引用
    return reverse;
}

LeetCode 验证结果如下图所示:

总结

本文我们分别使用了 Stack 和递归的方法实现了链表反转的功能,其中 Stack 的实现方式是利用了栈后进先出的特性可以直接对链表进行反转,实现思路和实现代码都比较简单,但在性能和内存消耗方面都不是很理想,可以作为笔试的保底实现方案;而递归的方式在性能和内存消耗方面都有良好的表现,同时它的实现代码也很简洁,读者只需理解代码实现的思路即可。

最后

大家看完有什么不懂的可以在下方留言讨论.
谢谢你的观看。
觉得文章对你有帮助的话记得关注我点个赞支持一下!

作者:Java中文社群
链接:https://juejin.im/post/6882999244869861383

相关文章

  • 热门的算法面试题你都不知道?链表反转的两种实现方法,后一种击败了

    前言 链表反转是一道很基础但又非常热门的算法面试题,它也在《剑指Offer》的第 24 道题出现过,至于它有多热(...

  • 链表反转

    概述 链表反转是非常经典的面试题,要实现此功能,需先实现链表的数据结构。 链表类 获得单向链表方法 输出单向链表方...

  • 数据结构之 swift 实现链表反转

    链表反转很熟悉的面试题,关于链表的基础知识就不再累赘了,如何swift实现链表的反转。 传入链表的头结点 返回一个...

  • Swift 反转链表 - LeetCode

    题目: 反转链表 反转一个单链表。示例: 进阶:你可以迭代或递归地反转链表。你能否用两种方法解决这道题? 方案一...

  • LeetCodeSwift 206.Reverse Linked

    题目 206.反转链表 反转一个单链表。 示例: 进阶:你可以迭代或递归地反转链表。你能否用两种方法解决这道题? ...

  • 206#反转链表

    题目描述 206#反转链表 反转一个单链表。 示例: 进阶:你可以迭代或递归地反转链表。你能否用两种方法解决这道题...

  • 206. 反转链表

    反转一个单链表。 你可以迭代或递归地反转链表。你能否用两种方法解决这道题?

  • 206. 反转链表(Python)

    题目 难度:★★☆☆☆类型:链表 反转一个单链表。 进阶:你可以迭代或递归地反转链表。你能否用两种方法解决这道题?...

  • 数据结构与算法之美(已面试部分)

    1.题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。 算法实现: 2.题目:输入两个...

  • 理解单链表的反转(java实现)

    要求很简单,输入一个链表,反转链表后,输出新链表的表头。  反转链表是有2种方法(递归法,遍历法)实现的,面试官最...

网友评论

    本文标题:热门的算法面试题你都不知道?链表反转的两种实现方法,后一种击败了

    本文链接:https://www.haomeiwen.com/subject/lcubpktx.html