从头到尾打印链表
方法1:
思路:
硬做,放入列表,翻转列表
class Solution:
def printListFromTailToHead(self, listNode):
newList = []
while listNode:
newList.append(listNode.val)
listNode = listNode.next
return newList[::-1]
运行时间:29ms 占用内存:5848k
方法2:
思路:
使用栈的先进后出特性,全部压入,然后全部弹出
class Solution:
def printListFromTailToHead(self, listNode):
stack = []
while listNode:
stack.append(listNode.val)
listNode = listNode.next
list = []
while stack:
list.append(stack.pop())
return list
运行时间:25ms 占用内存:5732k
涉及知识点:
什么是链表?
链表的特性
当进行插入和删除操作时,链表操作的时间复杂度仅为O(1)。另外,因为链表在内存中不是连续存储的,所以可以充分利用内存中的碎片空间。
链表的种类
链表包括单链表,双向链表,循环单链表,循环双链表。
单链表,由各个元素之间通过一个指针彼此链接。元素之间不能相互指向。每个元素包含两部分:数据成员和一个称为next的指针。
双向链表,每个链表元素既有指向下一个元素的指针,又有指向前一个元素的指针,其中每个结点都有两种指针。每个元素包含两部分:数据成员,一个称为pre的指针,一个称为next的指针。
循环链表,是在单链表和双向链表的基础上,使最后一个结点指向第一个结点从而实现循环。
什么是栈?
列表切片
Python中符合序列的有序序列都支持切片(slice),例如列表,字符串,元组。
格式:【start: end :step】
索引
索引包括:正索引和负索引两部分,如下图所示,以a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]为例:
start:起始索引,从0开始,-1表示结束
end:结束索引
step:步长,end-start,步长为正时,从左向右取值。步长为负时,反向取值。
注意:切片的结果不包含结束索引,即不包含切的最后一位
a=[1,2,3,4,5,6]
#省略全部,代表截取全部内容,可以用来将一个列表拷给另一个列表
b1=a[:]
print(b1)
结果:[1, 2, 3, 4, 5, 6]
#从位置0开始到结束,每次增加1,截取。不包含结束索引位置
b=a[0:-1:1]
print(b)
结果:[1, 2, 3, 4, 5]
#省略起始位置的索引,以及步长。默认起始位置从头开始,默认步长为1,结束位置索引为3
c1=a[:3]
print(c1)
结果:[1, 2, 3]
#从第一个位置到第留给位置,每3个取一个值
c=a[0:5:3]
print(c)
结果:[1, 4]
#反向取值
d=a[5:0:-1]
print(d)
结果:[6, 5, 4, 3, 2]
#反转列表
d1=a[::-1]
print(d1)
结果:[6, 5, 4, 3, 2, 1]