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