数据结构数组和链表
數(shù)組
數(shù)組(讀操作多,寫少的情況下)線性數(shù)據(jù)結(jié)構(gòu)
數(shù)組的特點可以在內(nèi)存中順序存儲,是一個順序表。 數(shù)組中的每一個元素,都存儲在小小的內(nèi)存單元中,并且元素之間接緊密排列,既不能打亂元素的存儲順序,也不能跳過某個存儲單元進行存儲。
讀取數(shù)組:
數(shù)組可以通過下標快速查找對應(yīng)的數(shù)據(jù),時間復雜度為O(1) 更新數(shù)據(jù):數(shù)組可以通過下標快速找到數(shù)據(jù)進行替換,時間復雜度為O(1)
插入數(shù)據(jù):
數(shù)組查找數(shù)據(jù)時間復雜度為O(1),然后需要將后面的數(shù)據(jù)依次后移和替換,數(shù)組循環(huán)進行替換的時間復雜度為O(n)。時間復雜度為 O(1)+O(n)=O(n)
刪除元素:
數(shù)組刪除元素也涉及到元素的移動時間復雜度為O(n)
鏈表
鏈表在內(nèi)存中是隨機存儲(讀操作少,寫多的情況下)線性數(shù)據(jù)結(jié)構(gòu)
單向鏈表
數(shù)據(jù)結(jié)構(gòu)為 data(存儲的變量)、next(下一個節(jié)點的指針)
雙向鏈表
數(shù)據(jù)結(jié)構(gòu)為 prev(上一節(jié)點) 、data(存儲的變量)、next(下一節(jié)點的指針)
鏈表的時間復雜度
鏈表的讀取:
首先要從第一個節(jié)點進行讀取,沒有找到在通過next進行讀取。時間復雜度為O(n)
鏈表的修改:
首先要找到該節(jié)點,直接修改該節(jié)點對應(yīng)的data就可以了,不考慮查找節(jié)點時間夫扎渡為O(1)
鏈表插入數(shù)據(jù);
在不考慮查找數(shù)據(jù),我們直需拿到上一個元素的next指向當前指針,在把當前指針的next指向下一指針就好了。不考慮查詢的時間復雜度為O(1)
鏈表刪除數(shù)據(jù):
在不考慮查詢的情況下,鏈表刪除數(shù)據(jù)直需把當前指針的next給上一指針即可。不考慮查詢的時間復雜度為O(1)
數(shù)組和鏈表的差異:
數(shù)組的優(yōu)勢在于能夠快速定位元素,對于讀操作多,寫操作少的情況下。使用數(shù)組更方便。相反使用讀操作少,寫操作多的情況下使用鏈表更方便。
鏈表代碼實現(xiàn)
public class APi {private Node head; //鏈表頭部private Node last; //鏈表尾部private int size; //鏈表長度/*** 鏈表插入數(shù)據(jù)* @param data 插入的值* @param index 插入的位置*/public void inseart(int data,int index) throws Exception{if(index < 0 || index > size) { //判斷鏈表是否超出下限throw new Exception("超出下標");}Node node=new Node(data); //創(chuàng)建鏈表if(size==0){//判斷鏈表長度是否為0head = node;last =node;} else if(index ==0){ //插入頭節(jié)點node.setNext(head);head = node;} else if(index==size) { //插入尾節(jié)點last.setNext(node); //上一個元素的next設(shè)為當前元素的值last=node; //當前尾節(jié)點}else{Node node1 = get(index - 1); // 拿到上一個元素node.setNext(node1.getNext()); //設(shè)置當前節(jié)點的next為上一個節(jié)點的nextnode1.setNext(node);}size++;}//查找鏈表public Node get(int index) throws Exception {if(index<0 || index>size){throw new IndexOutOfBoundsException("下標越界");}Node node=head;for(int i = 0; i < index; i++) {node=node.getNext();}return node;}//輸出鏈表public void output(){Node node = head;while (node != null) {System.out.println(node.getData());node = node.getNext();}}} public class Node {private int data ;private Node next;Node(int data){this.data = data;}public int getData() {return data;}public void setData(int data) {this.data = data;}public Node getNext() {return next;}public void setNext(Node node) {this.next = node;} }總結(jié)
- 上一篇: 从单向链表结构看空间复杂度换时间复杂度
- 下一篇: (转)伺服电机的选型计算方法