1. 程式人生 > 其它 >java 面試篇-單鏈表基礎

java 面試篇-單鏈表基礎

技術標籤:連結串列演算法單鏈表資料結構

java 實現單鏈表

一、資料結構的定義

  1. 連結串列節點的定義
    public class Node {
    	public int val;
    	public Node next;
    	public Node(int val, Node next) {
    		this.val = val;
    		this.next = next;
    	}
    	public Node(int val) {
    		this(val, null); 
    	}
    } 
    
  2. 單鏈表的定義
    public class LinkList {
    	public Node first; // 頭節點(不是真正的頭節點)
    public int size; // 元素個數 public LinkList() { this.first = null; this.size = 0; } }

二、單鏈表的基本操作(不帶啞結點)

  1. 在頭部插入一個節點 addFirst

    public void addFirst(int val) {
    	this.first = new Node(val, this.first);
    	this.size++;
    }
    
  2. 在 index 位置插入節點 addAt

    public void addAt(int index, int val) {
    	// 合法的插入位置有: 0 1 2 ... size - 1, size
    if (index < 0 || index > this.size) { System.out.println("index 不合法"); return ; } // 下文將介紹帶頭結點的插入,不需要單獨判斷 if (index == 0) { this.addFirst(val); return ; } Node pre = this.first; // 查詢插入位置的前一個節點 for (int i = 0; i < index - 1; i++ ) { pre = pre.next; } Node node = new
    Node(val, pre.next); pre.next = node; this.size++; }
  3. 在尾部插入一個節點 addLast

    public void addLast(int val) {
    	// 呼叫 addAt() 
    	this.addAt(this.size, val);
    }
    
  4. 刪除 index 位置上的節點 removeAt()

    public void removeAt(int index) {
    	// 刪除時合法的 index 有: 0 1 ... size - 1 (比插入時少一個 size)
    	if (index < 0 || index > size - 1) {
    		System.out.println("index 不合法");
    		return ;
    	}
    	// 下文將介紹帶頭結點的刪除,不需要特殊處理
    	if (index == 0) {
    		this.first = this.first.next;
    		this.size--;
    		return ;
    	}
    	Node pre = this.first;
    	// 查詢刪除位置的前一個節點
    	for (int i = 0; i < index - 1; i++) {
    		pre = pre.next;
    	}
    	pre.next = pre.next.next;
    	this.size--;
    	return ;
    }
    
  5. 查詢 index 位置上的節點 findAt()

    public Node findAt(int index) {
    	if (index < 0 || index > this.size - 1) {
    		System.out.println("inde 不合法");
    		return null;
    	}
    	Node cur = this.first;
    	forint i = 0; i < index; i++) {
    		cur = cur.next;
    	}
    	return cur;
    }
    

三、單鏈表的基本操作(帶啞結點)

  1. 在 index 位置上插入 addOn()
    /* 插入的思路是:
    	1. 找到插入位置的前一個節點 pre
    	2. 構造一個新節點 node
    	3. node.next = pre.next;
    	4. pre.next = node;
    	由於 first 節點沒有前驅節點,所以構造一個前驅啞結點,使得 pre.next 對所有節點通用,也就不需要判斷 index = 0 的情況了
    */
    public void addOn(int index, int val) {
    	// 省略合法性判斷
    	// dummy 指向第一個節點 first,dummy 為頭結點
    	Node dummy = new Node(-1, this.first);
    	Node pre = dummy;
    	// 此時不需要特殊處理 index = 0 , 注意此時是 i < index
    	for (int i = 0; i < index; i++) {
    		pre = pre.next;
    	}
    	Node node = new Node(val, pre.next);
    	pre.next = node;
    	this.size++;
    	// 還原
    	this.first = dummy.next;
    }
    
  2. 刪除 index 位置上的節點 removeOn(int index)
    public void removeOn(int index) {
    	// 省略 index 合法性處理
    	Node dummy = new Node(-1, this.first);
    	Node pre = dummy;
    	// 無需特殊處理 index = 0, 注意此時是 i < index
    	for (int i = 0; i < index; i++) {
    		pre = pre.next;
    	}
    	pre.next = pre.next.next;
    	this.size--;
    	// 還原
    	this.first = dummy.next;
    }
    

參考連結:
java 連結串列的常見操作
Java基礎–單鏈表的實現