数组&链表和跳表

数组

面对频繁的增删改,数组是非常的不方便,时间复杂度很高

链表

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

原文地址:https://www.cnblogs.com/gaowenxingxing/p/13833927.html