關于數據結構和算法, 確實有不少公司在面試的時候會考一些這樣的題, 甚至一些叼鉆的操作數據結構的題, 當這樣的問題其實在工作中基本上是用不到的.
如果為了迎合這樣的題, 為了面試而去面試的話,有些得不償失. 畢竟還是有不少公司會務實一些, 不會去考這類的題目, 如果花了太多精力去準備算法題結果沒考到,對實際工作也沒有大的實際意義, 那就得不償失了.
我的準備原則是:
- 基礎概念要清晰,“Node類的作用”, “Link類只對根節點進行操作”, 像這樣的核心概念要清晰.
- 深度和廣度達到下面這個代碼就可以了, 更偏門一些的題, 能有個大致的實現思路也就可以了.
- 對時間復雜度的表示法能有個清晰的認識.
在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.----------