数组
面对频繁的增删改,数组是非常的不方便,时间复杂度很高
链表
node和head
单链表:只有一个next指针
双链表:有next和pre两个指针,既能往后面走也能往前面走
循环链表:最后一个next指向head
java的指针是双链表
增加删除结点
pre结点的next指向new 节点,new的next指向后继的结点,时间复杂度是O(1)
删除节点是新增节点的反操作
数组和链表操作的时间复杂度
链表:
prepend: O(1)
APPEND: O(1)
LOOKUP:O(N) 这个的时间复杂度比较高
instert:O(1)
DELETE:O(1)
ARRAY:
prepend: O(1)
APPEND: O(1)
LOOKUP:O(1)
instert:O(N)
DELETE:O(N)
跳表
以理解工作原理为主
为了优化或者补足链表的缺陷
优化的思想:升维,空间换时间
移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/move-zeroes
题解
比较简单的一个题,那遇到0就交换一下 swap,遇到0交换一下
def movezero(self,nums):
zero = 0
for i in range(len(nums)):
if nums[i]!=0:
nums[i],nims[zero]=nums[zero],nums[i]
zero+=1