在目前,許多互聯網公司的面試已經要求能手撕集合源碼,集合源碼本身算是源碼里比較簡單的一部分,但是要在面試極短的10來分鐘內快速寫出一個簡易版的源碼還是比較麻煩的,很容易出現各種小問題。所以在平時就要注重這方面的聯系。
以下是我自己寫的一個簡易雙端隊列,我沒有實現List接口,因為里面要實現的函數方法太多了,所以只是挑了幾個核心的代碼來寫,本質其實就是頭插法和尾插法的結合。
代碼主要有三個文件,分別是Node節點,Deque類和測試文件。
Node:
package org.example.collection;import lombok.Data;import java.util.HashMap;
import java.util.Map;@Data
public class Node<T> {T var;Node<T> prev;Node<T> next;Node(Node<T> prev,T element, Node<T> next){this.var = element;this.next = next;this.prev = prev;}}
Deque實現文件:
package org.example.collection;public class DequeCode<E>{int size = 0;Node<E> first;Node<E> last;public DequeCode() {this.first = new Node<E>(null,null,null);this.last = new Node<E>(null,null,null);//first和last之間應該建立聯系first.next = last;last.prev = first;}public int size() {return size;}public void addFirst(E element){//采用頭插法來進行雙端的插入Node<E> node = new Node<>(null,element,null);size++;if(first.next==null){first.next = node;node.prev = first;return ;}Node<E> temp = first.next;first.next = node;node.prev = first;node.next = temp;temp.prev = node;}public void addLast(E element){//和頭插入相同的思路Node<E> node = new Node<>(null,element,null);Node<E> temp = last.prev;size++;if(last.prev==null){last.prev = node;node.next = last;return ;}last.prev = node;node.next = last;temp.next = node;node.prev = temp;}public void removeFirst() throws Exception {if(size == 0) throw new Exception("出現問題");Node<E> node = first.next;first.next = first.next.next;node.next.prev = first;}public void removeLast() throws Exception {if(size == 0) throw new Exception("出現問題");Node<E> node = last.prev;last.prev = last.prev.prev;node.prev.next = last;}public Node<E> peekFirst(){return first.next;}public Node<E> peekLast(){return last.prev;}
}
最后是測試文件:
package org.example.collection;public class TestDeque {public static void main(String[] args) throws Exception {DequeCode<Integer> deque = new DequeCode<>();deque.addFirst(1);deque.addLast(2);System.out.println(deque.peekFirst().var);System.out.println(deque.peekLast().var);deque.addFirst(3);deque.addLast(4);System.out.println(deque.peekFirst().var);System.out.println(deque.peekLast().var);deque.removeFirst();deque.removeLast();System.out.println(deque.peekFirst().var);System.out.println(deque.peekLast().var);}
}
結果和預期一致
代碼邏輯很簡單,但是細節方面仍有很大的提升空間。但是面試時間短,這些代碼能在10來分鐘無失誤寫出,想來也是夠用了。