import java.util.List; 2 import java.util.Iterator; 3 import java.util.LinkedList; 4 import java.util.NoSuchElementException; 5 6 /* 7 * @desc LinkedList測試程序。 8 * 9 * @author skywang 10 * @email [email protected] 11 */ 12 public class LinkedListTest { 13 public static void main(String[] args) { 14 // 測試LinkedList的API 15 testLinkedListAPIs() ; 16 17 // 將LinkedList當作 LIFO(後進先出)的堆棧 18 useLinkedListAsLIFO(); 19 20 // 將LinkedList當作 FIFO(先進先出)的隊列 21 useLinkedListAsFIFO(); 22 } 23 24 /* 25 * 測試LinkedList中部分API 26 */ 27 private static void testLinkedListAPIs() { 28 String val = null; 29 //LinkedList llist; 30 //llist.offer("10"); 31 // 新建一個LinkedList 32 LinkedList llist = new LinkedList(); 33 //---- 添加操作 ---- 34 // 依次添加1,2,3 35 llist.add("1"); 36 llist.add("2"); 37 llist.add("3"); 38 39 // 將“4”添加到第一個位置 40 llist.add(1, "4"); 41 42 43 System.out.println("\nTest \"addFirst(), removeFirst(), getFirst()\""); 44 // (01) 將“10”添加到第一個位置。 失敗的話,拋出異常! 45 llist.addFirst("10"); 46 System.out.println("llist:"+llist); 47 // (02) 將第一個元素刪除。 失敗的話,拋出異常! 48 System.out.println("llist.removeFirst():"+llist.removeFirst()); 49 System.out.println("llist:"+llist); 50 // (03) 獲取第一個元素。 失敗的話,拋出異常! 51 System.out.println("llist.getFirst():"+llist.getFirst()); 52 53 54 System.out.println("\nTest \"offerFirst(), pollFirst(), peekFirst()\""); 55 // (01) 將“10”添加到第一個位置。 返回true。 56 llist.offerFirst("10"); 57 System.out.println("llist:"+llist); 58 // (02) 將第一個元素刪除。 失敗的話,返回null。 59 System.out.println("llist.pollFirst():"+llist.pollFirst()); 60 System.out.println("llist:"+llist); 61 // (03) 獲取第一個元素。 失敗的話,返回null。 62 System.out.println("llist.peekFirst():"+llist.peekFirst()); 63 64 65 System.out.println("\nTest \"addLast(), removeLast(), getLast()\""); 66 // (01) 將“20”添加到最後一個位置。 失敗的話,拋出異常! 67 llist.addLast("20"); 68 System.out.println("llist:"+llist); 69 // (02) 將最後一個元素刪除。 失敗的話,拋出異常! 70 System.out.println("llist.removeLast():"+llist.removeLast()); 71 System.out.println("llist:"+llist); 72 // (03) 獲取最後一個元素。 失敗的話,拋出異常! 73 System.out.println("llist.getLast():"+llist.getLast()); 74 75 76 System.out.println("\nTest \"offerLast(), pollLast(), peekLast()\""); 77 // (01) 將“20”添加到第一個位置。 返回true。 78 llist.offerLast("20"); 79 System.out.println("llist:"+llist); 80 // (02) 將第一個元素刪除。 失敗的話,返回null。 81 System.out.println("llist.pollLast():"+llist.pollLast()); 82 System.out.println("llist:"+llist); 83 // (03) 獲取第一個元素。 失敗的話,返回null。 84 System.out.println("llist.peekLast():"+llist.peekLast()); 85 86 87 88 // 將第3個元素設置300。不建議在LinkedList中使用此操作,因爲效率低! 89 llist.set(2, "300"); 90 // 獲取第3個元素。不建議在LinkedList中使用此操作,因爲效率低! 91 System.out.println("\nget(3):"+llist.get(2)); 92 93 94 // ---- toArray(T[] a) ---- 95 // 將LinkedList轉行爲數組 96 String[] arr = (String[])llist.toArray(new String[0]); 97 for (String str:arr) 98 System.out.println("str:"+str); 99 100 // 輸出大小 101 System.out.println("size:"+llist.size()); 102 // 清空LinkedList 103 llist.clear(); 104 // 判斷LinkedList是否爲空 105 System.out.println("isEmpty():"+llist.isEmpty()+"\n"); 106 107 } 108 109 /** 110 * 將LinkedList當作 LIFO(後進先出)的堆棧 111 */ 112 private static void useLinkedListAsLIFO() { 113 System.out.println("\nuseLinkedListAsLIFO"); 114 // 新建一個LinkedList 115 LinkedList stack = new LinkedList(); 116 117 // 將1,2,3,4添加到堆棧中 118 stack.push("1"); 119 stack.push("2"); 120 stack.push("3"); 121 stack.push("4"); 122 // 打印“棧” 123 System.out.println("stack:"+stack); 124 125 // 刪除“棧頂元素” 126 System.out.println("stack.pop():"+stack.pop()); 127 128 // 取出“棧頂元素” 129 System.out.println("stack.peek():"+stack.peek()); 130 131 // 打印“棧” 132 System.out.println("stack:"+stack); 133 } 134 135 /** 136 * 將LinkedList當作 FIFO(先進先出)的隊列 137 */ 138 private static void useLinkedListAsFIFO() { 139 System.out.println("\nuseLinkedListAsFIFO"); 140 // 新建一個LinkedList 141 LinkedList queue = new LinkedList(); 142 143 // 將10,20,30,40添加到隊列。每次都是插入到末尾 144 queue.add("10"); 145 queue.add("20"); 146 queue.add("30"); 147 queue.add("40"); 148 // 打印“隊列” 149 System.out.println("queue:"+queue); 150 151 // 刪除(隊列的第一個元素) 152 System.out.println("queue.remove():"+queue.remove()); 153 154 // 讀取(隊列的第一個元素) 155 System.out.println("queue.element():"+queue.element()); 156 157 // 打印“隊列” 158 System.out.println("queue:"+queue); 159 }
160 }
Test "addFirst(), removeFirst(), getFirst()"llist:[10, 1, 4, 2, 3]llist.removeFirst():10llist:[1, 4, 2, 3]llist.getFirst():1Test "offerFirst(), pollFirst(), peekFirst()"llist:[10, 1, 4, 2, 3]llist.pollFirst():10llist:[1, 4, 2, 3]llist.peekFirst():1Test "addLast(), removeLast(), getLast()"llist:[1, 4, 2, 3, 20]llist.removeLast():20llist:[1, 4, 2, 3]llist.getLast():3Test "offerLast(), pollLast(), peekLast()"llist:[1, 4, 2, 3, 20]llist.pollLast():20llist:[1, 4, 2, 3]llist.peekLast():3get(3):300str:1str:4str:300str:3size:4isEmpty():trueuseLinkedListAsLIFOstack:[4, 3, 2, 1]stack.pop():4stack.peek():3stack:[3, 2, 1]useLinkedListAsFIFOqueue:[10, 20, 30, 40]queue.remove():10queue.element():20queue:[20, 30, 40]
LinkedList遍歷方式
(01) 第一種,通過迭代器遍歷。即通過Iterator去遍歷。
for(Iterator iter = list.iterator(); iter.hasNext();) iter.next();
(02) 通過快速隨機訪問遍歷LinkedList
int size = list.size(); for (int i=0; i<size; i++) { list.get(i); }
(03) 通過另外一種for循環來遍歷LinkedList
for (Integer integ:list) ;
(04) 通過pollFirst()來遍歷LinkedList
while(list.pollFirst() != null) ;
(05) 通過pollLast()來遍歷LinkedList
while(list.pollLast() != null) ;
(06) 通過removeFirst()來遍歷LinkedList
try { while(list.removeFirst() != null) ; } catch (NoSuchElementException e) { }
(07) 通過removeLast()來遍歷LinkedList
try { while(list.removeLast() != null) ; } catch (NoSuchElementException e) { }
遍歷LinkedList時,使用removeFist()或removeLast()效率最高。但用它們遍歷時,會刪除原始數據;若單純只讀取,而不刪除,應該使用第3種遍歷方式。
無論如何,千萬不要通過隨機訪問去遍歷LinkedList!