数据结构,数组与链表

大顶堆

完全二叉树:数据从上到下,从左到右

大顶堆:父节点的值大于或等于其左右节点的值

堆顶元素:arr[0] 堆底元素arr[arr.length - 1]

构建大顶堆

1.定义parent游标指向该节点

2.定义parent的左孩子child, child = 2*parent + 1 判断有没有左孩子,如果没有该节点符合大顶堆

3.检测有没有右孩子

4.如果有右孩子,左右孩子进行比较,让child指向左右孩子中的最大值

5.父子节点进行比较

6.如果父节点值大,该节点符合大顶堆,继续向前检测

7.如果子节点值大,父子节点进行交换,完成之后parent指向child,child指向左右孩子最大值

8.继续parent与child进行比较,直到parent值大或者child为空

时间复杂度:O(nlogn)


归并排序

先拆分再合并,在合并的过程中借助临时空间进行排序

拆分:从中间位置拆开,数据分成左右两部分,继续拆分,直到拆分成一个一个的时候停止

数组扩容

1.在数组长度不够时,创建一个新的比原来数组更长的新数组

2.让原数组中的数字依次复制到新数组当中

3.让arr指向brr,数据存入


数组插入

最后位置插入

1,判断现在数组有没有位置,如果没位置了考虑扩容

用size记录当前数组有效数据的个数,判断满没满就是看size和arr.length是否相等,相等则满了,考虑扩容,不等则可以添加,size指向有效数据的后一位

2,在下标是size的位置插入,size++

指定位置插入

1,判断位置的取值是否合理【0,size】

2,判断数组有没有位置

用size记录有效数据的个数,判断满没满就是看size和arr.length是否相等,相等则满课,考虑扩容,不等则可以添加

3,eg:在下标为4的位置插入

把原来的数组当中想要插入的位置及其之后的数据,按照从后往前的位置,统一从后向前移动一位,避免数据被覆盖

数据移动完成之后,原来的数据就不怕被覆盖掉,在目标位置插入新数据 size++


数组的删除

把数据覆盖掉,有效数据长度减少

指定位置删除

1,判断删除位置是否合理【0,size-1】

2,目标位置之后的数据,以从前到后的顺序整体向前覆盖 size--

时间复杂度O(n)

指定数据删除

eg:删除数组当中的2

1,首先找到要删除的数据,从后往前找,找到后记录其所在位置

2,目标位置之后的数据,按照从前到后的顺序,统一向前覆盖

3,size--,继续向前查找要删除的数据

找O(n) + 删O(n) = O(n)

补充:双指针

慢指针:需要更新的下标

快指针:获取新数组所需要的元素

如果fast指针遇到要删除的元素,直接跳过,fast++

否则将该值赋值给慢指针,fast++,slow++

size = slow


有序数组插入数据

找位置强行插入

1,判断现在数组有没有位置

用size记录当前数组有效数据的个数,判断满没满就是看size和arr.length是否相等,相等则满了,考虑扩容,不等则可以添加

2,【数组有效长度为0时】:arr[0]直接插入 size++

【要插入的为最大值】:value>arr[size-1] arr[size]直接插入 size++

【其他情况】:和指定位置插入一样,先找位置,找到第一个比插入数据大的,即为目标位置

目标位置及其之后的数据,按照从后往前的位置,依次向后移动,size++


构建链表

尾插法

1.判断head是否为空,如果为空直接插入

2.如果不为空,定义游标遍历整个链表,找到链表当中最后一个节点(最后一个节点的next域为null)

3.插入 i ->next = node

头插法

1.判断head是否为空,如果为空直接插入

2.如果不为空,新节点的next域将链表当中的第一个节点地址存下来 node ->next = head

3.head指向新节点 head = node


遍历链表

定义游标 i 遍历 i = head

输出当前节点的值 i->value

i = i ->next

直到 i 为空,整个遍历完成

输出链表的长度

定义一个变量count,每遍历一个数据,让变量+1, 最后输出变量的值

查找元素

每遍历一个数据,查看当前节点的value域和目标值是否相等,相等则找到了,不能查找下一个

指定位置插入

1.判断插入位置是否合理【0.链表长度】

2,如果在0号位置插入 头插法

3.如果在最后位置插入 尾插法

4.中间位置插入 先找出当前位置的节点 i 以及目标位置前一个节点pre

i 成为新节点的下一个节点 node->next = i

新节点成为pre的后一个节点 pre->next = node

指定位置删除

1.判断删除位置是否合理【0.链表长度-1】

2.删除位置为0 head = head ->next

3.删除中间位置的节点 先找出目标位置节点 i 以及目标位置前一个节点 pre

pre ->next = i->next

4.删除最后一个节点 pre ->next = null

先进后出

限制线性表(数组,链表)中元素的插入和删除。插入和删除在同一端进行

允许插入和删除的一端为变化端,称为栈顶

另外一段称为栈底

插入数据:定义栈顶初始值为-1,栈顶++

出栈:数据取出,栈顶--

判断栈满:每一次入栈的都要判断栈是否满,满了之后考虑扩容

设置数组长度为maxSize,则maxSize指向数组最后一个位置

插入之前判断栈顶和maxSize-1是否相等,相等则栈满

判断栈空:每一次出栈前都要判断栈是否空,栈顶为-1则表示栈空

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值