码迷,mamicode.com
首页 > 编程语言 > 详细

数组、链表、跳表得基本实现和特性

时间:2020-10-13 17:45:52      阅读:31      评论:0      收藏:0      [点我收藏+]

标签:实现   平衡   并且   source   极客   知识点   检查   plist   ast   

感谢极客7天掌握算法面试必考知识点这门课程

一、数组

  Java中对基于数组的ArrayList进行增加操作的时候是如何实现的呢?

首先Array增加和删除数组的时候需要进行元素的移动,比如:ABCEFG组成的数组中加入D 首先要下移EFG然后将D插入原来E的位置 。同理删除时候ABCDE要删除 也是先移出C然后然后DE的Index向上移动一位。

  我们来看一下JavaArrayList中新增数组进行了哪些操作:ArrayList源码

首先看add方法(在list最后加入):

技术图片

 

 

 这个方法做了如下操作:

  1、对操作计数

  2、判断ArryList的长度是否已经等于数组的长度了 如果已经等于说明不够用了需要增加ArrayList的长度

  3、数组长度+1,在数组中最后位置加上e元素

再看index位置插入元素的add方法:

技术图片

这个方法做了如下操作:

  1、检查index位置是否数组越界

  2、对操作计数

  3、判断ArryList的长度是否已经等于数组的长度了 如果已经等于说明不够用了需要增加ArrayList的长度

  4、判断插入数组位置不是最后一位 则:进行数组拷贝,该方法:1,2参数标识原数组以及拷贝起点位置,3,4表示拷贝到的新数组以及起点位置,5 表示拷贝长度 

  4、在数组index位置加上e元素

  5、数组长度+1

补充:

技术图片

 

 

 这个方法做了如下操作:

  如果入参>当前数组长度 那么:

  1、new一个新数组 长度为原数组的2倍并且与入参比较如果还不够就再增加

  2、把老数组拷贝进去

二、链表

  技术图片

 

 

 这是一个链表的结构:包含 Value:每一个Value都需要一个node作为元素对象

                   Next :指向下一个元素

              Head:头

              Tail:尾

  如果只有一个next指针 那么这个链表是单链表,如果拥有先前指针prev或者是previous就是双向链表 ,最后一个元素 指向了空 如果指向了Head 那么就是一个循环链表

  在Java中链表以LinkedList为例 :

技术图片

通过实现我们可以看到:它包含了previous 说明是一个双向链表,同时包含next first即为head指针 last即为tail指针 ,Entry即为node元素。

链表添加元素是如何实现的呢:

技术图片

在java的LinkedList中添加即为添加到最后:

技术图片

三、跳表 skipList

  跳表本身是基于链表的,跳表的使用必须基于有序链表,跳表对标的是平衡树和二分查找。Redis就应用了跳表。

  

 

数组、链表、跳表得基本实现和特性

标签:实现   平衡   并且   source   极客   知识点   检查   plist   ast   

原文地址:https://www.cnblogs.com/xcgShare/p/13807835.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!