【剑指offer】- JZ6 从尾到头打印链表

题目:

描述

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

如输入{1,2,3}的链表如下图:

返回一个数组为[3,2,1]

0 <= 链表长度 <= 10000

示例:

输入:

{1,2,3}

返回值:

[3,2,1]

 python代码:

# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param listNode ListNode类 
# @return int整型一维数组
#
class Solution:
    def printListFromTailToHead(self , listNode: ListNode) -> List[int]:
        # write code here
        #返回结果
        ls = list()
        #鲁棒性检查
        if not listNode:
            return []
        while listNode:
            ls.insert(0,listNode.val)
            listNode = listNode.next
        return ls
        

这里主要时间消耗在循环和 列表内置插入操作。

# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param listNode ListNode类 
# @return int整型一维数组
#
class Solution:
    def printListFromTailToHead(self , listNode: ListNode) -> List[int]:
        # write code here
        #返回结果
        ls = list()
        while listNode:
            ls.append(listNode.val)
            listNode = listNode.next
        return ls[::-1]
        

还有其他几种做法:

  • 递归直接尾往前遍历,放入数组。
  • 使用栈数据结构。这两方法本质差不多,一个使用系统栈一个使用自建栈。

【深入理解】:

  • 遍历长n链表的所有节点,时间复杂度为O(n),需要的空间复杂度为O(n)

后面有时间再细细研究~~ 后面还会使用java, C++刷一遍 。 java

【python知识点总结】

len(list)长度
max(list)最大值
min(list)最小值
list(seq)元组-->list

常用操作方法:

append(obj)尾末添加
count(obj)统计元素次数
extend(obj)末尾追加列表,(使用新列表拓展)
index(obj)索引某个值
insert(index,obj)插入
pop(index=-1)移除某值,并返回
remove(obj)移除第一个匹配值
reverse()列表翻转
sort(key=None,reverse=False)列表排序
clear清空
copy复制

程序中切片操作:

  • list[-1],此时只有一个参数,作用是通过下标访问数据,-1是倒数第一个。
  • list[:-1],作用是返回从start_index = 0到end_index = -1的一串数据。list[:-1]为左闭右开
  • list[::-1],作用是返回倒序的原list。
  • list[1:0:-1],返回第0,1的倒序。
  • list[::1],步长为1,步长大于0时,返回序列为原顺序;步长小于0时,返回序列为倒序。

    步长:[::-1]表示从右往左以步长为1进行切片。[::2]表示从左往右步长为2进行切片。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

瑾怀轩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值