LeetCode 从头到尾打印链表

题目描述

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

示例 1:

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

一得之见(Java/Python)

使用 list 顺序存放 head 的每个元素,然后创建一个 int 数组 result,长度为 list.size(),然后通过遍历将 list 的尾部元素即 list.get(size - i - 1)赋值给 result[i],直至循环结束。

时间复杂度:O(n),反向遍历一遍 list

空间复杂度:O(n),使用一个 list 存储链表中的每个节点。

    /**
* 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
*
* @param head 链表头结点
* @return 从尾到头反过来返回每个节点的值(用数组返回)
*/
public static int[] reversePrint(ListNode head) {
List<ListNode> list = new ArrayList<ListNode>();
ListNode temp = head;
while (temp != null) {
list.add(temp);
temp = temp.next;
}
int size = list.size();
int[] result = new int[size];
for (int i = 0; i < size; i++) {
result[i] = list.get(size - i - 1).val;
}
return result;
}
def reverse_print(head: ListNode) -> List[int]:
"""
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
:param head: 链表头结点
:return: 从尾到头反过来返回每个节点的值(用数组返回)
"""
head_list = []
temp = head
while temp is not None:
head_list.append(temp)
temp = temp.next
list_len = len(head_list)
result = [0 for i in range(list_len)]
for i in range(list_len):
result[i] = head_list[list_len - i - 1].val
return result

他山之石(Java/Python)

辅助栈法

栈的特点是后进先出,即最后压入栈的元素最先弹出。考虑到栈的这一特点,使用栈将链表元素顺序导致。从链表的头节点开始,依次将每个节点压入栈内,然后依次弹出栈内的元素并存储到数组中。

  • 创建一个栈,用于存储链表的节点
  • 创建一个指针,初始时指向链表的头节点
  • 当指针指向的元素非空时,重复下列操作:
    • 将指针指向的节点压入栈内
    • 将指针移到当前节点的下一个节点
  • 获得栈的大小 size,创建一个数组 print,其大小为 size
  • 创建下标并初始化 index = 0
  • 重复 size 次下列操作
    • 从栈内弹出一个节点,将该节点的值存到 print[index]
    • 将 index 的值加
  • 返回 print

时间复杂度:O(n),空间复杂度:O(n)

    /**
* 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
*
* @param head 链表头结点
* @return 从尾到头反过来返回每个节点的值(用数组返回)
*/
public static int[] reversePrintTwo(ListNode head) {
Stack<ListNode> stack = new Stack<ListNode>();
ListNode temp = head;
while (temp != null) {
stack.push(temp);
temp = temp.next;
}
int size = stack.size();
int[] print = new int[size];
for (int i = 0; i < size; i++) {
print[i] = stack.pop().val;
}
return print;
}
}
def reverse_print_three(head: ListNode) -> List[int]:
"""
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
:param head: 链表头结点
:return: 从尾到头反过来返回每个节点的值(用数组返回)
"""
stack = []
while head:
stack.append(head.val)
head = head.next
return stack[::-1]

递归法

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

时间复杂度:O(n),空间复杂度:O(n)

def reverse_print_two(head: ListNode) -> List[int]:
"""
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
:param head: 链表头结点
:return: 从尾到头反过来返回每个节点的值(用数组返回)
"""
return reverse_print_two(head.next) + [head.val] if head else []

效率对比(Java)

输入:[0,1,3,2]
方法一:78800ns
方法二:111900ns

效率对比(Python)

输入:[0,1,3,2]
方法一:13200ns
方法二:24300ns
方法三:6300ns

其他知识点

[::-1]和[-1]用法

[::-1]顺序相反操作

[-1]读取倒数第一个元素

[3::-1]从下标为 3(到下标为 0 结束) 的元素开始翻转读取

链表

链表(Linked List)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。

由于不必须按顺序存储,链表在插入的时候可以达到 O(1)的复杂度,比另一种线性表——顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要 O(n)的时间,而顺序表相应的时间复杂度为 O(log n) 和 O(1)。

基本机构
/**
* @author zhkai
*/
public class ListNode {
public int val;
public ListNode next; public ListNode(int x) {
val = x;
}
}
创建链表
/**
* @author zhkai
*/
public class CreateListNode {
public static ListNode createListNode(int[] nums) {
int len = nums.length;
if (len < 1) {
return null;
}
// 创建首节点
ListNode nodeSta = new ListNode(nums[0]);
// 声明一个变量用来在移动过程中
ListNode nextNode;
// 指向首节点
nextNode = nodeSta;
// 创建链表
for (int i = 1; i < len; i++) {
// 生成新的节点
ListNode node = new ListNode(nums[i]);
// 把新的节点连接起来
nextNode.next = node;
// 当前节点往后移动
nextNode = nextNode.next;
}
// 当for循环完成之后,nextNode指向最后一个节点
nextNode = nodeSta;
return nextNode;
}
}

LeetCode 从头到尾打印链表的更多相关文章

  1. 剑指offer:从头到尾打印链表

    目录 题目 解题思路 具体代码 题目 题目链接 剑指offer:从头到尾打印链表 题目描述 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 解题思路 首先题目实际给出的要求是返回ve ...

  2. 《剑指Offer》面试题-从头到尾打印链表

    题目描述: 输入一个链表,从尾到头打印链表每个节点的值. 输入: 每个输入文件仅包含一组测试样例.每一组测试案例包含多行,每行一个大于0的整数,代表一个链表的节点.第一行是链表第一个节点的值,依次类推 ...

  3. 剑指offer编程题Java实现——面试题5从头到尾打印链表

    题目描述* 剑指offer面试题5:从尾到头打印链表 输入一个链表的头结点,从尾到头打印出每个结点的值 解决方案一:首先遍历链表的节点后打印,典型的"后进先出",可以使用栈来实现这 ...

  4. 剑指offer面试题5 从头到尾打印链表(c)

  5. 剑指offer三从头到尾打印链表

    一.题目: 输入一个链表,从尾到头打印链表每个节点的值. 二.解题方法: 方法一:采用递归的方式实现 方法二:借助堆栈的“后进先出”实现 import java.util.ArrayList; imp ...

  6. 剑指offer 6:链表(从头到尾打印链表)

    链表的数据结构 struct ListNode { int value; ListNode* next; }; 那么在链表的末尾添加一个节点的代码如下: void insert(ListNode** ...

  7. 剑指Offer-【面试题05:从头到尾打印链表】

    package com.cxz.question5; import java.util.Stack; /* * 输入个链表的头结点,从尾到头反过来打印出每个结点的值. * */ public clas ...

  8. 剑指offer面试题5 从头到尾打印链表(java)

    注:(1)这里体现了java数据结构与C语言的不同之处 (2)栈的操作直接利用stack进行 package com.xsf.SordForOffer; import java.util.Stack; ...

  9. 剑指offer中经典的算法题之从头到尾打印链表

    话不多说上代码: 我自己的算法是: /** * public class ListNode { * int val; * ListNode next = null; * * ListNode(int ...

随机推荐

  1. 洛谷 P5664 [CSP-S2019] Emiya 家今天的饭

    链接: P5664 题意: 给出一个 \(n*m\) 的矩阵 \(a\),选 \(k\) 个格子(\(1\leq k\leq n\)),每行最多选一个,每列最多选\(⌊\dfrac k2⌋\) 个,同 ...

  2. 一个C#开发搭建Android框架的心路历程

    前言 Java框架实在是太多了,因为是初学乍练,所以,只好以百度为标准选择框架了. Java的框架文章太难写了,因为他引用了太多框架,而没一个框架都有很繁琐的配置,把每个框架都写一遍,就等于写书了:所 ...

  3. 关于linux的fork的一点学习总结

    最近操作系统的实验要用到fork,于是去搜索了一下资料,很幸运地在博客中找到一篇深度好文: http://blog.csdn.net/jason314/article/details/5640969 ...

  4. TypeError: Error when calling the metaclass bases Cannot create a consistent method resolution

    Python Error when calling the metaclass bases Cannot create a consistent method resolution order (MR ...

  5. 纯 CSS 自定义多行省略:从原理到实现

    文字溢出怎么展示,你的需求是什么?单行还是多行?截断,省略,自定义样式,自适应高度?在这里你都能找到答案.接下来我会由浅入深,从原理到实现,带你一步步揭开多行省略的面纱.我们先从最简单的单行溢出省略开 ...

  6. 问题 B: 比大小

    题目描述 给你两个很大的数,你能不能判断出他们两个数的大小呢? 比如123456789123456789要大于-123456 输入 每组测试数据占一行,输入两个不超过1000位的10进制整数a,b 数 ...

  7. selenium的 元素定位、元素信息、交互

    selenium的元素定位? 元素定位:自动化要做的就是模拟鼠标和键盘来操作来操作这些元素,点击.输入等等.操作这些元素前首先 要找到它们,WebDriver提供很多定位元素的方法 方法: 1.fin ...

  8. 菜鸡的Java笔记 - java 枚举

    枚举        枚举属于加强版的多例设计模式            多例设计模式与枚举        多例设计模式的本质在于构造方法的私有化.而后在类的内部产生若干个实例化对象,随后利用一个 st ...

  9. Error filterStart

    一般原因为:1.xml配置失误filter应配置在servlet-mapping前面(应该都知道吧).看看class配的 别找不到.2.filter中某段代码未实例化(这个情况是出现最多的,要仔细检查 ...

  10. Dapr-状态管理

    前言: 前一篇对Dapr的服务调用方式进行了解,本篇继续对状态管理进行了解. 一.状态管理-解决的问题 在分布式应用程序中跟踪状态存在一下问题: 应用程序可能需要不同类型的数据存储. 访问和更新数据时 ...