關于數據結構和算法的總結

關于數據結構和算法, 確實有不少公司在面試的時候會考一些這樣的題, 甚至一些叼鉆的操作數據結構的題, 當這樣的問題其實在工作中基本上是用不到的.
如果為了迎合這樣的題, 為了面試而去面試的話,有些得不償失. 畢竟還是有不少公司會務實一些, 不會去考這類的題目, 如果花了太多精力去準備算法題結果沒考到,對實際工作也沒有大的實際意義, 那就得不償失了.

我的準備原則是:
  1. 基礎概念要清晰,“Node類的作用”, “Link類只對根節點進行操作”, 像這樣的核心概念要清晰.
  2. 深度和廣度達到下面這個代碼就可以了, 更偏門一些的題, 能有個大致的實現思路也就可以了.
  3. 對時間復雜度的表示法能有個清晰的認識.

在Link類中, 實現添加數據 add(String data), 查找數據是否存在contains(String data), 刪除數據remove(String data), 打印所有節點中封裝的數據print().

//節點類的存在意義在于要封裝一個數據.
//Node類的實現很多都是通過遞歸調用來完成的.

class Node {
    private String data;  //要包裝的數據
    private Node next;    //保存它的下一個節點的位置

    public Node(String data) { //節點類的功能就是包裝數據
        this.data = data;
    }

    public void setNext(Node next) {
        this.next = next;
    }

    public Node getNext() {
        return this.next;
    }

    public String getData() {
        return this.data;
    }

    public void addNode(Node newNode) { //將節點保存在合適的位置上
        if(this.next == null ) { //當前節點之后沒有其他節點
            this.next = newNode;
        } else { //當前節點之后還有節點
            this.next.addNode(newNode); //通過遞歸調用保存新節點的位置
        }
    }

    public void printNode() {
        System.out.printLn(this.data);  //輸出當前節點的數據
        if(this.next != null) { //當前節點后面還有節點
            this.next.printNode();  //也是通過遞歸調用完成
        }
    }

    public boolean containsNode(String data) {
        if(this.data.equals(data)) {    //當前節點的數據為要查找的數據
            return true;
        } else {    // 當前節點的數據不是要查找的數據, 繼續向下查找
            if (this.next != null) { //當前節點后還有其他的節點
                this.next.containsNode(data);
            } else {  //當前節點后沒有節點了.
                return false;
            }
        }
    }

    public void removeNode(Node previous, String data) {
        if(this.data.equals(data)) { //要刪除的就是當前節點
            previous.next = this.next; //空出當前節點
        } else {
            this.next.removeNode(this, data); //還是通過遞歸調用完成
        }
    }


}
//鏈表類對外提供的所有API的實現都是通過直接調用根節點來完成的.
class Link { // 表示鏈表的操作類, 主要就是操作Node類.
    private Node root; //將根節點定義為類中的屬性

    public void add(String data) { //設置要增加的數據
        if(data == null ) {
            return; //如果數據為空, 直接返回
        }

        Node newNode = new Node(data); //將數據包裝在節點中
        if(this.root == null) { //現在還沒有根節點
            this.root = newNode;    //第一個節點作為根節點
        } else {    //如果根節點已經存在, 則通過Node類指定新創建的節點的保存位置
            this.root.addNode(newNode);
        }
    }

    public void print() {
        if(this.root != null ) {    //當前有節點有數據,可以輸出鏈表里的所有數據
            this.root.printNode();  //輸出工作還是交給Node類去做.
        }
    }

    public boolean contains(String data) {
        if(data == null || this.root = null) {
            return false;  //要查詢的數據為空, 或是鏈表中還沒有根節點的話,就直接返回false了.
        }
        return this.root.containsNode(data);  //交給Node類完成
    }

    public void remove(String data) {
        if(this.contains(data)) { 要刪除的節點存在
            if(this.root.getData().equals(data) { //如果要刪除的是根節點
                this.root = this.root.getNext();  //讓根節點的下一個節點為新的根節點
            } else { 交給Node類完成
                //從根節點的下一個節點開始, 判斷要刪除的節點
                this.root.getNext().removeNode(this.root, data);
            }
        }
    }
}
//測試代碼
public class Demo {
    public static void main(String args[]) {
        Link all = new Link();
        all.add("A");
        all.add("B");
        all.add("C");
        all.remove("B");
        all.contains("C");
        all.print();
        System.out.printLn(all.contains("A"));
        System.out.printLn(all.contains("X"));
    }
}

refer to:
視頻講座
魔樂 java核心 25-數據結構 - 簡單鏈表

-------DONE.----------

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容