前兩天找工作面試過程中,被一家搞大資料的問到了二叉樹、演算法相關的,本來大學時就沒學好,經過幾年的工作,平時用的更少,一下子看著題簡單,就是寫不上來。
因為工作中總是一上來不管什麼型別,就開始array,arraylist,hashmap,hashset就搞起了,好像就沒用過什麼的別的結構。雖然明知道這樣是不對的,但是那種懶勁上來,別的都不管了。最近危機感非常重,因為慢慢發現雖然會的框架越來越多,配的越來越溜,資料庫表設計也越來越規範,但是總感覺根基不穩。這種不穩的感覺來自於對框架底層的實現的漠視和資料結構的生疏。
資料結構學不好,則會導致在編碼中一些場合選型錯誤,效能低下,記憶體大。框架吃不透,設計模式不精,則會導致系統模組間耦合性高,難以修改,做不了大專案。
所以決定重拾一下之前落下的知識,從0再學一遍。找了本書,就按書的目錄來一篇一篇學習,記錄。供日後自己隨時檢視。
第一篇是單鏈表。
特點就是每次要找某個節點,都需要從頭開始遍歷,查詢效率低,不如陣列和arraylist能記錄節點的下標位置,根據下標位置直接就能找到。但是插入和刪除時效率高,因為只需要在被插入的位置移動乙個節點就可以了,而arraylist則需要移動所有的在被插入位置的後面元素,會整體往後推乙個位置。
下面來實現乙個簡單的單鏈表模型。
定義乙個節點類node,乙個屬性string用來存值,乙個node物件用來存下個節點。
package singlelink;
/** * created by wuwf on 2017/3/25.
*/public class node
public string getdata()
public void setdata(string data)
public node getnext()
public void setnext(node next)
}
再定義乙個linkedlist來代表這個單鏈表結構,裡面有新增到末尾,新增到某個位置等方法
package singlelink;
/** * created by wuwf on 2017/3/25.
* 單鏈表
*/public class linkedlist
public int size()
public void print()
node node = head;
while (node != null)
}/**
* 在末尾追加乙個節點
** @param node
*/public void add(node node)
//如果鍊錶為空,那新增的這個node就作為head
if (size == 0) else
last.setnext(node);
}size++;
}/**
* 在某個位置插入乙個節點
** @param index
* @param node
*/public void insert(int index, node node)
if (node == null)
//插頭部
if (index == 0) else
node.setnext(tempnode.getnext());
tempnode.setnext(node);
}size++;
}}
linkedlist裡定義了乙個屬性size來記錄鍊錶的總長度,裡面不能存在null的值。
head代表第乙個節點,如果head也為null,代表該鍊錶為空的。
add方法是在末尾追加乙個節點,這個比較好理解。做法就是從head到尾遍歷,然後在尾節點setnext(新節點)即可。
insert方法解釋一下,是在某個位置插入乙個節點。做法是先找到要被插入的位置的上乙個節點(父節點a),然後將新節點b作為a的next節點,再將原來的a的next作為新節點b的next即可。理解很容易,寫成**時還需要做一些越界和為空判斷。
我只寫了add和insert,只要這兩個理解了,那麼delete其實和add是一樣的步驟。
java 資料結構 學習筆記1
資料結構是對計算機記憶體中的資料的一種安排,資料結構包括 陣列,鍊錶,棧,二叉樹,雜湊表等,演算法則對對這些結構中的資料進行各種處理 下表簡單列了一下以後要用到的資料結構 陣列 優點 插入快,如果知道下標,可以快速的訪問,缺點 查詢 刪除慢 大小是固定的 有序陣列 優點 比無序陣列查詢快 缺點 刪除...
java資料結構之單鏈表
在單鏈表中對表頭進行插入或者刪除時,時間複雜度為o 1 單鏈表查詢指定節點時因為要進行迴圈查詢,平均需要查詢n 2次,所以時間複雜度為o n 儲存密度 資料占用的儲存量 整個結點占用的儲存量。根據這個公式可以得出單鏈表的儲存密度為大於1,在空間利用率上面比順序表要差 所以可以得出以下結論 單鏈表一般...
java資料結構之單鏈表
一 單鏈表的結點結構 node類 package data public class node public int getdata public void setdata int data public node getnext public void setnext node next 測試類 ...