zoukankan      html  css  js  c++  java
  • Leetcode刷题笔记

    从尾到头打印链表

    输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。

    示例 1:

    输入:head = [1,3,2]
    输出:[2,3,1]

    限制:

    0 <= 链表长度 <= 10000

    我的思路:

    先从头到尾遍历链表,将链表节点中的值存入新开辟的数组空间,再将数组顺序倒置。

    C++代码如下:

     1 /**
     2  * Definition for singly-linked list.
     3  * struct ListNode {
     4  *     int val;
     5  *     ListNode *next;
     6  *     ListNode(int x) : val(x), next(NULL) {}
     7  * };
     8  */
     9 class Solution {
    10 public:
    11     vector<int> reversePrint(ListNode* head) {
    12         vector<int> list;
    13         ListNode* p = head;
    14         while(p != NULL){
    15             list.push_back(p->val); //将每个链表节点的值都存在数组中
    16             p = p->next;
    17         }
    18         int temp;
    19         for(int i=0;i<list.size()/2;i++){ //再将数组首尾倒置
    20             temp = list[i];
    21             list[i] = list[list.size()-1-i];
    22             list[list.size()-1-i] = temp;
    23         }
    24         return list;
    25     }
    26 };

    其他参考思路:均用到了栈。

    方法一:递归法

    解题思路:

    利用递归: 先走至链表末端,回溯时依次将节点值加入列表 ,这样就可以实现链表值的倒序输出。

    Python 算法流程:

    递推阶段: 每次传入 head.next ,以 head == None(即走过链表尾部节点)为递归终止条件,此时返回空列表 [] 。
    回溯阶段: 利用 Python 语言特性,递归回溯时每次返回 当前 list + 当前节点值 [head.val] ,即可实现节点的倒序输出。


    Java 算法流程:

    递推阶段: 每次传入 head.next ,以 head == null(即走过链表尾部节点)为递归终止条件,此时直接返回。
    回溯阶段: 层层回溯时,将当前节点值加入列表,即tmp.add(head.val)。
    最终,将列表 tmp 转化为数组 res ,并返回即可。


    复杂度分析:

    时间复杂度 O(N): 遍历链表,递归N次。
    空间复杂度 O(N): 系统递归需要使用O(N)的栈空间。

    方法二:辅助栈法

    解题思路:

    链表特点: 只能从前至后访问每个节点。
    题目要求: 倒序输出节点值。
    这种 先入后出 的需求可以借助 栈 来实现。

    算法流程:

    入栈: 遍历链表,将各节点值 push 入栈。(Python​ 使用 append() 方法,​Java​借助 LinkedList 的addLast()方法)。
    出栈: 将各节点值 pop 出栈,存储于数组并返回。(Python​ 直接返回 stack 的倒序列表,Java ​新建一个数组,通过 popLast() 方法将各元素存入数组,实现倒序输出)。


    复杂度分析:

    时间复杂度 O(N): 入栈和出栈共使用 O(N) 时间。
    空间复杂度 O(N): 辅助栈 stack 和数组 res 共使用 O(N)的额外空间。

  • 相关阅读:
    45_ansible概述、ansible基础 、ad-hoc、批量配置管理
    44_自定义镜像及仓库、持久化存储 、 Docker网络架构
    43_Docker概述、部署Docker、Docker镜像、Docker基本命令
    42_KVM简介、 Virsh管理 、 自定义虚拟机、虚拟设备管理
    41_iptables防火墙 filter表控制 扩展匹配 nat表典型应用
    40_系统审计 服务安全 Linux安全之打补丁
    39_加密与解密 AIDE入侵检测系统 扫描与抓包
    38_Linux基本防护 用户切换与提权 SSH访问控制 SELinux安全 、SSH访问控制 SELinux安全
    hdu5530
    bzoj3456
  • 原文地址:https://www.cnblogs.com/Weems/p/12627456.html
Copyright © 2011-2022 走看看