集合、棧和隊列

 

 一個算法解決一個問題,算法是無止盡的,重要的是要學會需求分析和畫圖,再轉換成代碼實現的編程思想;java

1、數組和鏈表算法

數組只能經過索引訪問元素;編程

集合,是一個概念,只要能存放數據的容器並能動態大小,都是集合;數組

一、ArrayList本身實現,基於數組3d

 

 

 

 

 

 

 

 

 

 

 

 引用對象賦值實際是賦值的地址值,temp地址值再賦值給objs,保證始終操做的是objs對象名;指針

size是實際元素個數,保證不能訪問沒有元素的索引;對象

修改某個索引對應元素:blog

 

刪除某索引對應元素:索引

 

 

 

 

 從刪除的索引位置開始,後面全部的元素都向前移動一位,如排隊;隊列

清除集合:

 

 

 size=0就是邏輯清除,訪問不到了,並無正在清除;

二、LinkedList實現

2.1節點類

 

 java沒有正在直接操做地址值的指針,有對應地址值的引用;

 2.2 LinkedList實現

 

 

 

 

 

設置和獲取已存在某位置的節點的元素值:

 

 

 

移除一個元素:

 

 

 

 只須要將鏈表上的前一個元素的指向下一個元素的地址值改爲被移除的元素的下一個就能夠;

鏈表的元素本就是散落存在的,沒有實際的連線,就是經過引用對象名確定會存儲表頭結點的地址,而後從表頭開始挨個訪問下一個結點地址;

 

 

 

數組,刪除添加時候,後面的全部元素的位置都要移動一位,多的時候效率很低,若是長度不夠了,還要「搬家」,小數組搬到大數組裏面,arr.length*3/2+1;查找時候,地址值連續,有索引,二分查找,速度極快;

鏈表,for循環遍歷的話,外面for自己循環一次,裏面鏈表本身沒有索引也要循環找到當前for循環的這一步,嵌套循環,沒有索引,效率很低,使用for each 迭代器遍歷;增刪時候只需改先後指針(引用對象節點地址值),增刪很快,仍是要先遍歷找到要修改的值,因此增刪時候雙向循環鏈表首尾同樣很快,中間最慢;

2、棧

一、棧的實現

 

 使用隊列效率更高,只須要處理尾節點;

 

隊列使用鏈表也是同樣,只須要處理尾結點,無需遍歷,效率更高;

 

相關文章
相關標籤/搜索