LinkedList重寫(5)LinkedList簡單的封裝和增加泛型
package Study.Collection;
/**
* <p>Description: </p>
* 封裝,全部加泛型
* @author zhangyan
* @date 2018/12/23 10:05
*/
public class YanLinkedList04<E> {
private Node first;
private Node last;
private int size;
public void add(int index, E element) { //alt+shift+R
checkRange(index);
Node newNode = new Node(element);
Node temp = getNode(index);
if(temp!=null){
Node up = temp.previous;
if(index==size){ //最後一個元素
last.next = newNode;
newNode.previous = last;
}
if(index==0){ //第一個元素
newNode.next = first;
first.previous = newNode;
}else { //正常情況下
up.next = newNode;
newNode.previous = up;
newNode.next = temp;
temp.previous = newNode;
}
}
}
public void remove(int index){
checkRange(index);
Node temp = getNode(index);
if(temp!=null){
Node up = temp.previous;
Node down = temp.next;
if(up!=null){
up.next = down;
}
if(down!=null){
down.previous = up;
}
//被刪除的元素是第一個元素時
if(index==0){
first = down;
}
//被刪除的元素是最後一個元素時
if(index == size-1){
last = up;
}
size--;
}
}
//[]
//["a","b","c","d","e","f"] 2
public E get(int index) {
checkRange(index);
Node temp = getNode(index);
return temp!=null?(E)temp.element:null;
}
//封裝一個checkRange() 方法
private void checkRange(int index){
if(index<0||index>size-1){
throw new RuntimeException("索引數字不合法:"+index);
}
}
private Node getNode(int index){
checkRange(index);
Node temp = null;
if(index<=(size>>1)){ //size>>1相當於除以2
temp = first;
for(int i=0;i<index;i++){
temp = temp.next;
}
}else{
temp = last;
for(int i=size-1; i>index;i--){
temp = temp.previous;
}
}
return temp;
}
public void add(E element) {
Node node = new Node(element);
if(first==null){
first = node;
last = node;
}else{
node.previous = last;
node.next = null;
last.next = node;
last = node;
}
size++;
}
public String toString() {
StringBuilder sb = new StringBuilder("[");
Node temp = first;
while(temp!=null){
sb.append(temp.element+",");
temp = temp.next;
}
sb.setCharAt(sb.length()-1, ']');
return sb.toString();
}
//測試
public static void main(String[] args) {
//增加泛型String約束
YanLinkedList04<String> list = new YanLinkedList04<>();
list.add("a");
list.add("b");
System.out.println(list);
System.out.println(list.get(1));
}
}
解析:最後一步是對之前的優化,具體實現看程式碼!很簡單的
相關文章
- Java 容器和泛型(2)ArrayList 、LinkedList和Vector比較Java泛型
- 寫一個簡單的Linkedlist,實現增刪改查
- Gson泛型封裝泛型封裝
- ArrayList和LinkedList的區別?
- ArrayList和LinkedList的區別
- ArrayList和LinkedList的比較
- ArrayList和LinkedList如何實現的?
- LinkedList分析
- 5-AVI–Fragment簡單封裝Fragment封裝
- ArrayList和LinkedList區別 javaJava
- LinkedList原始碼原始碼
- 自定義LinkedList
- Java集合——LinkedListJava
- Java中LinkedListJava
- Java中ArrayList和LinkedList區別Java
- java學習 -- 利用類的反射和泛型自己動手寫jdbc封裝小類庫Java反射泛型JDBC封裝
- LinkedList 的實現原理
- ArrayList和LinkedList的區別是什麼
- 簡單問題,封裝和框架!封裝框架
- 簡單封裝get和jsonp封裝JSON
- Retrofit的簡單封裝封裝
- IQueryable的簡單封裝封裝
- ProgressFragment的簡單封裝Fragment封裝
- 其實泛型很簡單泛型
- 泛型就這麼簡單泛型
- Java 集合之LinkedListJava
- LinkedList類詳解
- LinkedList原始碼解析原始碼
- LinkedList實現原理
- Java ArrayList 與 LinkedListJava
- LinkedList原始碼分析原始碼
- LinkedList和ArrayList的區別、Vector和ArrayList的區別
- LinkedList的底層實現
- JDBC泛型類反射封裝結果集JDBC泛型反射封裝
- android使用gson和泛型解析伺服器回撥的封裝Android泛型伺服器封裝
- 簡單易懂的 Go 泛型使用和實現原理介紹Go泛型
- 走進 JDK 之 LinkedListJDK
- Java LinkedList 原始碼剖析Java原始碼