Java筆記集合之LinkedList

1、簡介

使用數組來存儲數據的一個缺點是,數組是靜態的結構,因此 不能被容易的擴展或減少數據集。維護新數組也貴 插入和刪除。 在這一章裏,我們考慮另一個名爲鏈表的數據結構 地址的一些侷限性數組。

一個鏈表是一個線性數據結構,其中每個元素是一個單獨的 對象。

每個元素(我們叫它節點的兩個項目——組成的列表 數據和到下一個節點的引用。 最後一個節點的引用null。 入口點到鏈表稱爲的列表。 應該注意,頭 不是一個單獨的節點,而是第一個節點的引用。 如果列表爲空,那麼是一個主管 空引用。

一個鏈表是一個動態的數據結構。 列表中的節點的數目是不固定的,可以生長 對需求和收縮。 任何應用程序的處理需要數量未知的對象 使用鏈表。

對數組鏈表的一個缺點是它不允許 直接訪問單個元素。 如果你想訪問一個特定的項目 你必須從頭部開始,遵循項目的引用,直到你到達。

另一個缺點是,鏈表使用更多的內存與——我們額外的數組 4個字節(32位CPU)存儲到下一個節點的引用。

2、鏈表分類

鏈表分類
單鏈表    可以通過後驅找到後續節點
雙鏈表 有前驅和後驅,可以找到前驅結點和後繼結點
循環鏈表 最後一個節點的後驅是第一個節點

3、構造方法

LinkedList() 
          構造一個空列表。
LinkedList(Collection<? extendsE> c)
          構造一個包含指定 collection 中的元素的列表,這些元素按其 collection 的迭代器返回的順序排列。

4、方法摘要

 boolean add(E e)
          將指定元素添加到此列表的結尾。
    void add(int index,E element)
          在此列表中指定的位置插入指定的元素。
 boolean addAll(Collection<? extendsE> c)
          添加指定 collection 中的所有元素到此列表的結尾
 boolean addAll(int index,Collection<? extendsE> c)
          將指定 collection 中的所有元素從指定位置開始插入此列表。
   void addFirst(E e)
          將指定元素插入此列表的開頭。
   void addLast(E e)
          將指定元素添加到此列表的結尾。
   void clear()
          從此列表中移除所有元素。
  Object clone()
          返回此 LinkedList 的淺表副本
 boolean contains(Object o)
          如果此列表包含指定元素,則返回 true
 Iterator<E> descendingIterator()
          返回以逆向順序在此雙端隊列的元素上進行迭代的迭代器。
    E element()
          獲取但不移除此列表的頭(第一個元素)。
    E get(int index)
          返回此列表中指定位置處的元素。
    E getFirst()
          返回此列表的第一個元素。
    E getLast()
          返回此列表的最後一個元素。
 int indexOf(Object o)
          返回此列表中首次出現的指定元素的索引,如果此列表中不包含該元素,則返回 -1。
 int lastIndexOf(Object o)
          返回此列表中最後出現的指定元素的索引,如果此列表中不包含該元素,則返回 -1
 Iterator<E> listIterator(int index)
          返回此列表中的元素的列表迭代器(按適當順序),從列表中指定位置開始。
 boolean offer(E e)
          將指定元素添加到此列表的末尾(最後一個元素)。
 boolean offerFirst(E e)
          在此列表的開頭插入指定的元素
 boolean offerLast(E e)
          在此列表末尾插入指定的元素。
    E peek()
          獲取但不移除此列表的頭(第一個元素)。
    E peekFirst()
          獲取但不移除此列表的第一個元素;如果此列表爲空,則返回 null
    E peekLast()
          獲取但不移除此列表的最後一個元素;如果此列表爲空,則返回 null
    E poll()
          獲取並移除此列表的頭(第一個元素)
    E pollFirst()
          獲取並移除此列表的第一個元素;如果此列表爲空,則返回 null
    E pollLast()
          獲取並移除此列表的最後一個元素;如果此列表爲空,則返回 null
    E pop()
          從此列表所表示的堆棧處彈出一個元素。
 void push(E e)
          將元素推入此列表所表示的堆棧。
    E remove()
          獲取並移除此列表的頭(第一個元素)。
    E
remove(int index)
          移除此列表中指定位置處的元素。
    boolean
remove(Object o)
          從此列表中移除首次出現的指定元素(如果存在)。
    E
removeFirst()
          移除並返回此列表的第一個元素。
 boolean removeFirstOccurrence(Object o)
          從此列表中移除第一次出現的指定元素(從頭部到尾部遍歷列表時)。
   E removeLast()
          移除並返回此列表的最後一個元素。
  boolean removeLastOccurrence(Object o)
          從此列表中移除最後一次出現的指定元素(從頭部到尾部遍歷列表時)。
   E set(int index,E element)
          將此列表中指定位置的元素替換爲指定的元素。
  int size()
          返回此列表的元素數
 Object[] toArray()
          返回以適當順序(從第一個元素到最後一個元素)包含此列表中所有元素的數組。
  
<T> T[]
toArray(T[] a)
          返回以適當順序(從第一個元素到最後一個元素)包含此列表中所有元素的數組;返回數組的運行時類型爲指定數組的類型。
12 12

5、部分代碼

1、添加、獲取、刪除、遍歷

public class TestLinkedList {
	public static void main(String[] args) {
		LinkedList<String> books = new LinkedList();

		// 把元素添加到列表的結尾
		books.add("A");
		books.add("B");
		books.add("C");

		// 把元素添加到列表的第一個位置
		books.addFirst("1");

		// 把元素添加到列表的最後一個位置
		books.addLast("8");

		// 把元素添加到列表的最後一個位置
		books.offer("X");

		// 把元素添加到列表的第一個位置
		books.offerFirst("0");

		// 把元素添加到列表的最後一個位置
		books.offerLast("9");

		// 遍歷方法一
		Iterator<String> iter = books.iterator();
		while (iter.hasNext()) {
			String element = iter.next();
			System.out.print(element);
		}
		// 輸出 :01ABC8X9

		// 遍歷方法二
		for (String str : books) {
			System.out.print(str);
		}
		// 輸出 :01ABC8X9

		// 獲取鏈表的第一個元素,並且不移除
		// 方法一
		System.out.println(books.getFirst());
		// 方法二
		System.out.println(books.element());
		// 方法三
		System.out.println(books.peek());
		// 方法四
		System.out.println(books.peekFirst());

		// 獲取第一個元素並且移除
		// 方法一
		System.out.println(books.poll());
		// 方法二
		System.out.println(books.pollFirst());
		// 方法三
		System.out.println(books.remove());
		// 方法四
		System.out.println(books.removeFirst());

		// 遍歷方法三,到序遍歷
		iter = books.descendingIterator();
		while (iter.hasNext()) {
			String element = iter.next();
			System.out.print(element);
		}

		// 獲取子鏈表
		System.out.println(books.subList(0, 2));
		// 刪除指定位置的元素
		books.subList(0, 2).clear();
		for (String str : books) {
			System.out.print(str);
		}
	}
}

2、實現棧的效果

public class TestLinkedListandSXtack {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		MyStacks ms = new MyStacks();
		//入棧
		ms.Push("A");
		ms.Push("B");
		ms.Push("C");
		//LinkedList 轉 ArrayList
		ms.Show();
		
		//獲取棧頂元素
		System.out.println(ms.Top());
	
		
		//連續出棧
		System.out.println(ms.Pop());
		System.out.println(ms.Pop());
		System.out.println(ms.Pop());
	}

}
class MyStacks
{
	private LinkedList<Object> list = new LinkedList<Object>();
	
	public void Show(){
		//LinkedList 轉 ArrayList
		ArrayList<Object> ay = new ArrayList<Object>(list);
		for(Object str:ay){
			System.out.print(str);
		}
		System.out.println();
	}
	
	//獲取棧頂元素
	public Object Top(){
		return list.getFirst();//list.element();
	}
	//入棧
	public void Push(Object o){
		list.addFirst(o);
	}
	//出棧
	public Object Pop(){
		return list.remove();
	}
}

3、實現隊列的效果

<p><span style="font-weight: normal;">package com.jlz;
import java.util.*;
public class TestLinkedListAndQueue {
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		MyQueue queue = new MyQueue();
		queue.Put("A");
		queue.Put("B");
		queue.Put("C");
		
		while(!queue.isEmpty()){
			System.out.print(queue.Get());
		}
	}
}
class MyQueue
{
	LinkedList<Object> list = new LinkedList<Object>();
	//入隊列,添加到隊尾
	public void Put(Object o){
		list.addLast(o);
	}
	//出隊列
	public Object Get(){
		return list.removeFirst();
	}
	//判斷是否爲空
	boolean isEmpty(){
		return list.isEmpty();
	}
}
</span></p>

4、轉換爲數組(長度爲0,長度爲鏈表長度)、轉換爲ArrayList

package com.jlz;
import java.util.*;
public class LinkedListChangeIndex {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		LinkedList<String> list =  new LinkedList<String>();
		list.add("A");
		list.add("B");
		list.add("C");
		//轉爲數組,數組長度爲0
		String str[] = list.toArray(new String[0]);
		for(String s:str){
			System.out.print(s);
		}
		//轉爲數組,數組長度爲鏈表長度
		String string[] = list.toArray(new String[list.size()]);
		for(String s:string){
			System.out.print(s);
		}
		//轉爲ArrayList
		ArrayList<String> alist = new ArrayList<String>(list);
		for(Object o:alist){
			System.out.print(o);
		}
	}

}

5、同步

package com.jlz;
import java.util.*;
public class LinkedListStackSynchronized {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		LinkedList<Object> stack = new LinkedList<Object>();
		stack.addFirst("A");
		stack.addFirst("B");
		stack.addFirst("C");
		//同步
		stack = (LinkedList<Object>)Collections.synchronizedList(stack);
	}

}


發佈了39 篇原創文章 · 獲贊 16 · 訪問量 9274
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章