1. 程式人生 > >資料結構學習筆記Day2-單鏈表(用java實現)

資料結構學習筆記Day2-單鏈表(用java實現)

一、首先說一下線性表

1. 什麼是線性表,線性表的邏輯特性?

1)有一個頭(表頭),有一個尾(表尾) 2)表頭與表尾之間的元素有且只有一個前驅元素,有且只有一個後繼元素

2.線性表有兩種儲存方式?

順序表和連結串列

3.順序表和連結串列的區別?

1)順序表是一邊連續的儲存空間 在這裡插入圖片描述 連結串列是一片雜湊的儲存空間 在這裡插入圖片描述 2)順序表只要知道表頭就可以快速查詢到其他任何位置的元素。 因為順序表是連續排列的,比如我們知道了1號元素的位置,要想查6號元素的位置,只需將1號元素的位置加5個距離就能立刻知道6號元素的位置。而連結串列則不行,在連結串列中,想要知道某個元素的位置,必須通過該元素的上一個元素的指標去查。 3)連結串列利於資料的插入和刪除操作,而順序表則不利於插入和刪除操作。 在順序表中我們若刪除一個元素,則需將該元素後面的所有元依此前移一位,而連結串列只需將插入位置的前一位元素的指標指向自己,將自己的指標指向插入位置的後一位元素即可。 4)因為連結串列中會有一部分空間用來儲存指標,所以空間利用率會比順序表稍差一些。

二、用java實現簡單的連結串列(單鏈表的插入,刪除操作)

1.首先,連結串列中的節點是一個單獨的物件,我們因該將其抽離出來。

一個節點包括兩個屬性:資料(用於存放資料),和指標(指向下一個節點),所以建立節點類如下:

package myStudy.dataStructure.day2;

/**
*
* @description 節點類
* @author shenrenfeng
* @date 2018年11月4日 上午11:14:07
*
*/
public class Node {

	private int data;// 節點資料
	private Node next;// 節點指標,指向下一個節點
	
	public Node(int data) {
		this.data = data;
		this.next = null;
	} 
	
	public int getData() {
		return data;
	}
	public void setData(int data) {
		this.data = data;
	}
	public Node getNext() {
		return next;
	}
	public void setNext(Node next) {
		this.next = next;
	}
	
}

2、建立單鏈表類

單鏈表至少包括一個屬性:頭節點

package myStudy.dataStructure.day2;

/**
*
* @description 單鏈表
* @author shenrenfeng
* @date 2018年11月4日 上午11:16:23
*
*/
public class SinglyLinkedList {
	
	private Node firstNode;// 頭節點
	
	/**
	 * 插入節點(在頭節點之後插入)
	 * @param data
	 */
	public void insert(int data) {
		Node node = new Node(data);
		if(firstNode == null) {
			firstNode = node;
		} else {
			node.setNext(firstNode.getNext());
			firstNode.setNext(node);
		}
	}
	
	/**
	 * 刪除節點(刪除頭節點)
	 * @return 返回被刪除的頭節點
	 */
	public Node delete() {
		Node deletedNode = firstNode;
		firstNode = firstNode.getNext();
		return deletedNode;
	}
	
	/**
	 * 展示連結串列資料
	 */
	public void showList() {
		Node currentNode = firstNode;
		while(currentNode != null) {
			System.out.print(currentNode.getData());
			System.out.print(" ");
			currentNode = currentNode.getNext();
		}
	}

	public Node getFirstNode() {
		return firstNode;
	}

	public void setFirstNode(Node firstNode) {
		this.firstNode = firstNode;
	}

}

3、進行測試

package myStudy.dataStructure.day2;

/**
*
* @description 測試單鏈表
* @author shenrenfeng
* @date 2018年11月4日 上午11:39:50
*
*/
public class Test {

	public static void main(String[] args) {
		SinglyLinkedList list = new SinglyLinkedList();
		list.insert(9);
		list.insert(2);
		list.insert(4);
		list.insert(8);
		list.insert(5);
		list.showList();
		System.out.println();
		list.delete();
		list.delete();
		list.delete();
		list.showList();
	}
	
}

測試結果: 在這裡插入圖片描述 結果說明: 因為一個插入的作為頭節點,所以9在最前面,而後面每次是從頭節點之後插入的,類似倒序,所以插入順序雖然為9 2 4 5 8 輸出結果卻為9 5 8 4 2 刪除是直接將頭節點刪除