LinkedList也就是我們在數(shù)據(jù)結構中鏈表,這種數(shù)據(jù)結構具有這樣的特性:
分配內存空間不是必須連續(xù)的。
插入刪除很快,只要修改前后指針就可以了 ,時間復雜度為O(1)。
訪問比較慢,必須從第一個元素開始遍歷,時間復雜度為O(n)。
在Java中,LinkedList提供了極其豐富的方法,可以模擬鏈式隊列,鏈式堆棧等數(shù)據(jù)結構,給我們帶來了極大的方便。下面來康康用法。
add(增加一個元素)
boolean add(E e)在鏈表后添加一個元素,如果成功返回ture,如果不成功,則返回false。
void addFirst(E e)在鏈表頭部添加一個元素。
void addLast(E e)在鏈表尾部添加一個元素。
void add(int index ,E element)在指定位置添加一個元素。
代碼演示:
public class LinkedListMethodsDemo {
public static void main(String[] args) {
LinkedList<String> linkedList = new LinkedList<>();
linkedList.add("first");
linkedList.add("second");
linkedList.add("third");
System.out.println(linkedList);
linkedList.addFirst("addFirst");
System.out.println(linkedList);
linkedList.addLast("addLast");
System.out.println(linkedList);
linkedList.add(2, "addByIndex");
System.out.println(linkedList);
}
}
結果:
[first, second, third]
[addFirst, first, second, third]
[addFirst, first, second, third, addLast]
[addFirst, first, addByIndex, second, third, addLast]
remove(移出):
E remove() 刪除鏈表中第一個元素。
boolean remove(Object o)移除鏈表中指定的元素。
E remove(int index):移除鏈表中指定位置的元素。
E removeFirst() 移除鏈表中的第一個元素,與remove類似。
E removeLast()移出鏈表中的最后一個元素。
boolean removeFirstOccurrence(Object o)移除鏈表中第一次元素出現(xiàn)所在的位置。
boolean removeLastOccurrence(Object o)移除鏈表中最后一次元素出現(xiàn)所在的位置。
代碼演示
public class LinkedListMethodsDemo {
public static void main(String[] args) {
LinkedList<String> linkedList = new LinkedList<>();
linkedList.add("first");
linkedList.add("second");
linkedList.add("second");
linkedList.add("third");
linkedList.add("four");
linkedList.add("five");
System.out.println(linkedList);
linkedList.remove();
System.out.println("remove: " + linkedList);
linkedList.remove("second");
System.out.println("remove(Object): " + linkedList);
linkedList.remove("six");
System.out.println("remove(Object) not exist: " + linkedList);
linkedList.remove(2);
System.out.println("remove(index): " + linkedList);
linkedList.removeFirst();
System.out.println("removeFirst: " + linkedList);
linkedList.removeLast();
System.out.println("removeLast:" + linkedList);
System.out.println("----------------------------------");
linkedList.clear();
linkedList.add("first");
linkedList.add("second");
linkedList.add("first");
linkedList.add("third");
linkedList.add("first");
linkedList.add("five");
System.out.println(linkedList);
linkedList.removeFirstOccurrence("first");
System.out.println("removeFirstOccurrence: " + linkedList);
linkedList.removeLastOccurrence("first");
System.out.println("removeLastOccurrence: " + linkedList);
}
}
結果:
[first, second, second, third, four, five]
remove: [second, second, third, four, five]
remove(Object): [second, third, four, five]
remove(Object) not exist: [second, third, four, five]
remove(index): [second, third, five]
removeFirst: [third, five]
removeLast:[third]
----------------------------------
[first, second, first, third, first, five]
removeFirstOccurrence: [second, first, third, first, five]
removeLastOccurrence: [second, first, third, five]
get(獲取)
E get(int index) 按照下邊獲取元素
E getFirst():獲取第一個元素
E getLast():獲取最后一個元素。
代碼演示
public class LinkedListMethodsDemo {
public static void main(String[] args) {
LinkedList<String> linkedList = new LinkedList<>();
linkedList.add("first");
linkedList.add("second");
linkedList.add("second");
linkedList.add("third");
linkedList.add("four");
linkedList.add("five");
System.out.println(linkedList);
linkedList.get(3);
System.out.println("get(index): " + linkedList.get(3));
linkedList.getFirst();
System.out.println("getFirst: " + linkedList.getFirst());
linkedList.getLast();
System.out.println("getLast: " + linkedList.getLast());
System.out.println(linkedList);
}
}
結果:
[first, second, second, third, four, five]
get(index): third
getFirst: first
getLast: five
[first, second, second, third, four, five]
push,pop,poll
void push(E e) ,與addFirst一樣,實際上他就是addFirst,在鏈表頭部添加一個元素。
E pop():與removeFirst一樣,實際上就是removeFirst。移除鏈表中的第一個元素.
E poll():查詢并移除第一個元素;
代碼演示:
public class LinkedListMethodsDemo {
public static void main(String[] args) {
LinkedList<String> linkedList = new LinkedList<>();
linkedList.push("first");
linkedList.push("second");
linkedList.push("second");
linkedList.push("third");
linkedList.push("four");
linkedList.push("five");
System.out.println("linkedList: " + linkedList);
System.out.println("pop: " + linkedList.pop());
System.out.println("after pop: " + linkedList);
System.out.println("poll: " + linkedList.poll());
System.out.println("after poll: " + linkedList);
}
}
結果:
linkedList: [five, four, third, second, second, first]
pop: five
after pop: [four, third, second, second, first]
poll: four
after poll: [third, second, second, first]
通過代碼示例可以看出:push,pop的操作已經(jīng)很接近stack(棧)的操作了。
如果鏈表為空的時候,看看poll與pop是啥區(qū)別:
public class LinkedListMethodsDemo {
public static void main(String[] args) {
LinkedList<String> linkedList = new LinkedList<>();
System.out.println("poll: " + linkedList.poll());
System.out.println("pop: " + linkedList.pop());
}
}
結果:
poll: null
Exception in thread "main" java.util.NoSuchElementException
at java.util.LinkedList.removeFirst(LinkedList.java:270)
at java.util.LinkedList.pop(LinkedList.java:801)
at org.ks.algorithm.LinkedListMethodsDemo.main(LinkedListMethodsDemo.java:13)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
可以看出poll返回null,而pop則產(chǎn)生異常。
peek
E peek() : 獲取第一個元素但是不移除。
E peekFirst : 獲取第一個元素但是不移除。
E peekLast : 獲取最后一個元素但是不移除。
代碼演示:
public class LinkedListMethodsDemo {
public static void main(String[] args) {
LinkedList<String> linkedList = new LinkedList<>();
linkedList.push("first");
linkedList.push("second");
linkedList.push("second");
linkedList.push("third");
linkedList.push("four");
linkedList.push("five");
System.out.println("linkedList: " + linkedList);
System.out.println("peek: " + linkedList.peek());
System.out.println("peekFirst: " + linkedList.peekFirst());
System.out.println("peekLast: " + linkedList.peekLast());
System.out.println("linkedList: " + linkedList);
}
}
輸出:
linkedList: [five, four, third, second, second, first]
peek: five
peekFirst: five
peekLast: first
linkedList: [five, four, third, second, second, first]
如果沒找到對應的元素,統(tǒng)統(tǒng)輸出null:
public class LinkedListMethodsDemo {
public static void main(String[] args) {
LinkedList<String> linkedList = new LinkedList<>();
System.out.println("linkedList: " + linkedList);
System.out.println("peek: " + linkedList.peek());
System.out.println("peekFirst: " + linkedList.peekFirst());
System.out.println("peekLast: " + linkedList.peekLast());
}
}
輸出:
linkedList: []
peek: null
peekFirst: null
peekLast: null
offer
boolean offer(E e) : 在鏈表尾部插入一個元素。
boolean offerFirst(E e) : 與addFirst一樣,實際上它就是addFirst;
boolean offerLast(E e) : 與addLast一樣,實際上它就是addLast;
代碼演示:
public class LinkedListMethodsDemo {
public static void main(String[] args) {
LinkedList<String> linkedList = new LinkedList<>();
linkedList.push("first");
linkedList.push("second");
linkedList.push("second");
linkedList.push("third");
linkedList.push("four");
linkedList.push("five");
System.out.println("linkedList: " + linkedList);
linkedList.offer("six");
System.out.println("linkedList: " + linkedList);
linkedList.offerFirst("zero");
System.out.println("linkedList: " + linkedList);
linkedList.offerLast("seven");
System.out.println("linkedList: " + linkedList);
}
}
輸出:
linkedList: [five, four, third, second, second, first]
linkedList: [five, four, third, second, second, first, six]
linkedList: [zero, five, four, third, second, second, first, six]
linkedList: [zero, five, four, third, second, second, first, six, seven]
LinkedList中常用的方法基本都列出來了,當然還有一些其他的例子,這里就一起演示了:
boolean contains(Object o) : 如果此列表包含指定元素,則返回 true。
E element() :獲取但不移除此列表的頭(第一個元素)。
E set(int index ,E element) : 將此列表中指定位置的元素替換為指定的元素。
List<E> subList(int fromIndex,int toIndex) :返回列表中指定的 fromIndex(包括 )和 toIndex(不包括)之間的部分視圖。(如果 fromIndex 和 toIndex 相等,則返回的列表為空)。
public class LinkedListMethodsDemo {
public static void main(String[] args) {
LinkedList<String> linkedList = new LinkedList<>();
linkedList.push("first");
linkedList.push("second");
linkedList.push("second");
linkedList.push("third");
linkedList.push("four");
linkedList.push("five");
System.out.println("linkedList: " + linkedList);
System.out.println("linkedList.contains(\"second\"): " + linkedList.contains("second"));
System.out.println("linkedList.contains(\"six\"): " + linkedList.contains("six"));
System.out.println("linkedList.element(): " + linkedList.element());
System.out.println("linkedList: " + linkedList);
System.out.println("linkedList.set(3, \"set\"): " + linkedList.set(3, "set"));
System.out.println("linkedList: " + linkedList);
System.out.println("linkedList.subList(2,4): " + linkedList.subList(2,4));
System.out.println("linkedList: " + linkedList);
}
}
輸出:
linkedList: [five, four, third, second, second, first]
linkedList.contains("second"): true
linkedList.contains("six"): false
linkedList.element(): five
linkedList: [five, four, third, second, second, first]
linkedList.set(3, "set"): second
linkedList: [five, four, third, set, second, first]
linkedList.subList(2,4): [third, set]
linkedList: [five, four, third, set, second, first]