题目:
描述
输入一个链表的头节点,按链表从尾到头的顺序返回每个节点的值(用数组返回)。
如输入{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进行切片。