美文网首页
阿里面试题(1)反转链表

阿里面试题(1)反转链表

作者: 禁卫君 | 来源:发表于2020-05-09 22:06 被阅读0次

题目信息

问题:如何实现一个高效的单向链表逆序输出?
出题人:阿里巴巴出题专家:昀龙/阿里云弹性人工智能负责人

代码

分别用C语言和Java完成了该题目,题目在Leetcode上难度是简单

  1. C语言代码采用的是递归法
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* reverseList(struct ListNode* head){
    // 特殊情况, 原样返回
    if (head == NULL || head->next == NULL) {
        return head;
    }
    // 该题使用递归的方法
    // 找到最后一个节点,作为新的头
    // 而其他的节点接受反转

    // 找到倒数第二个节点和最后一个节点
    struct ListNode* curr = head;
    struct ListNode* lastNode;
    struct ListNode* lastSecondNode;
    while (curr != NULL) {
        // 最后一个节点
        if (curr->next == NULL) {
            lastNode = curr;
        }
        // 倒数第二个节点
        else if (curr->next->next == NULL) {
            lastSecondNode = curr;
        }
        curr = curr->next;
    }

    // 倒数第二个节点后面接 NULL, 作为最后一个节点
    lastSecondNode->next = NULL;
    // 递归部分 最后一个节点接上反转
    lastNode->next = reverseList(head);
    return lastNode;
}

  1. Java语言代码利用了栈结构后进先出的特点实现了链表的反转。
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode reverseList(ListNode head) {
        // 特殊情况
        if (head == null || head.next == null) {
            return head;
        }
        // 用栈来做这题
        Stack<ListNode> stack = new Stack<>();
        // 将所有节点压入栈
        ListNode curr = head;
        while (curr != null) {
            stack.push(curr);
            curr = curr.next;
        }
        // 最后一个节点作为新的头
        ListNode newHead = stack.peek();
        while (!stack.isEmpty()) {
            // 指针指向弹出的节点
            ListNode node = stack.pop();
            // 弹出后栈空了
            if (stack.isEmpty()) {
                node.next = null;
            }
            else {
                node.next = stack.peek();
            } 
        }
        // 返回新的 head
        return newHead;
    }
}

总结

递归与栈结构两种的空间复杂度都比较低,但是时间复杂度很高。
网友们有更加好的方法,值得学习。

视频教程

视频教程

相关文章

  • 链表的反转

    反转链表是一道很基本的面试题,通过更改节点之间的链接来反转链表。 1.单链表的反转 题目 示例 用一幅图来解释:这...

  • 反转链表

    《剑指offer》面试题24:输入一个链表,反转链表后,输出新链表的表头。 思路:反转链表就是将链表中每一个节点的...

  • 阿里面试题(1)反转链表

    题目信息 问题:如何实现一个高效的单向链表逆序输出?出题人:阿里巴巴出题专家:昀龙/阿里云弹性人工智能负责人 代码...

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

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

  • 1.数据结构-链表问题

    链表相关问题 删除节点 链表去重 有环链表 反转链表 链表排序 链表相交 其他问题 面试题 02.03. 删除中间...

  • Algorithm小白入门 -- 单链表

    单链表递归反转链表k个一组反转链表回文链表 1. 递归反转链表 单链表节点的结构如下: 1.1 递归反转整个单链表...

  • 【教3妹学算法】2道链表类题目

    题目1:反转链表 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1: 输入:head ...

  • 剑指offer目录

    目录 面试题3 在二维数组中查找 面试题15 链表中倒数第K个数 面试题16 反转链表 面试题44 扑克牌的顺子

  • 反转单向链表

    单向链表的反转是一个非常常见的链表类面试题,我在刷leetcode的过程中,发现了有许多链表题目的解法,都是以反转...

  • 链表反转

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

网友评论

      本文标题:阿里面试题(1)反转链表

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