連結串列 - 單向連結串列
單向連結串列包含多個節點,且每個節點都有一個指向後繼元素的next指標。連結串列中的最後一個節點的next指標值為null,表示該連結串列結束。
單向連結串列的實現
/**
* 連結串列的型別宣告
* 以int型別為例
*/
public class ListLinkNode {
public int data;
public ListLinkNode next;
public ListLinkNode(int data) {
this.data = data;
this.next = null;
}
@Override
public String toString() {
return data + "";
}
}
連結串列的操作
- 遍歷連結串列
- 在連結串列中插入一個元素
- 在連結串列中刪除一個元素
1 - 遍歷連結串列
程式碼:
/**
* 連結串列的長度
* 時間複雜度:O(n)
* 空間複雜度:O(1) :近用於建立臨時變數
* @return 連結串列的長度
*/
public int length() {
int size = 0;
ListLinkNode temp = first;
while (temp != null) {
size++;
temp = temp.next;
}
return size;
}
思路:
沿著指標遍歷
遍歷時計數
當next指標的值為NULL時結束遍歷
2 - 在連結串列中插入一個元素
程式碼:
/**
* 時間複雜度:O(n)
* 空間複雜度:O(1):近用於建立臨時變數
*
* @param index 從0開始
* @param node 要插入的節點
* @return 插入失敗則返回null
* 插入成功則返回連結串列的頭結點
* <p>
* 邊界:
* 空連結串列,插入位置 = 0 則插入成功且返回插入節點
* 空連結串列,插入位置 非0 則插入失敗且返回null
*/
public ListLinkNode insertLinked(int index, ListLinkNode node) {
//當連結串列為空時
if (first == null) {
if (index == 0) {
first = node;
last = node;
return first;
} else {
return null;
}
}
//位置資訊不合法,則返回null
if (index > length()) {
return null;
}
//插入到頭結點
if (index == 0) {
node.next = first;
first = node;
return node;
} else {
int i = 1;
ListLinkNode temp = first;
while (temp != null) {
if (i == index) {
ListLinkNode save = temp.next;
temp.next = node;
node.next = save;
if (save == null) {
last = node;
}
return node;
}
i++;
temp = temp.next;
}
}
return null;
}
思路:
當連結串列為空連結串列時插入操作
插入連結串列頭
插入除連結串列頭外的其他位置
3 - 在連結串列中刪除一個元素
程式碼:
/**
* 時間複雜度:O(n)
* 空間複雜度:O(1):近用於建立臨時變數
*
* @param index 以0開始
* @return 刪除失敗則返回null
* 刪除成功則返回被刪除的節點
* 刪除失敗則返回null
*/
public ListLinkNode deleteNode(int index) {
//當時空連結串列時刪除操作
if (first == null) {
return null;
}
//當刪除的位置資訊不合法時
if (index >= length()) {
return null;
}
//當刪除的是連結串列頭時
if (index == 0) {
ListLinkNode temp = first;
first = first.next;
return temp;
} else {
int i = 0;
ListLinkNode temp = first;
ListLinkNode before = null;
while (temp != null) {
if (i == index) {
before.next = temp.next;
return temp;
} else {
before = temp;
}
i++;
temp = temp.next;
}
//若是index不合法的話last則是null;
last = null;
}
return null;
}
思路:
刪除空連結串列
刪除連結串列頭
刪除連結串列頭以外的節點
4 - 獲取連結串列中第 index 個節點的值。如果索引無效,則返回-1。
程式碼:
/**
* 獲取連結串列中第 index 個節點的值。如果索引無效,則返回-1。
*
* @param index
* @return
*/
public int getValueByIndex(int index) {
if (index >= length() || isEmpty()) {
return -1;
}
if (index == 0) {
return first.data;
} else {
int i = 0;
ListLinkNode temp = first;
while (temp != null) {
if (i == index) {
return temp.data;
}
i++;
temp = temp.next;
}
return -1;
}
}
相關文章
- 連結串列-雙向連結串列
- 連結串列-雙向通用連結串列
- 資料結構--陣列、單向連結串列、雙向連結串列資料結構陣列
- 資料結構與演算法——連結串列 Linked List(單連結串列、雙向連結串列、單向環形連結串列-Josephu 問題)資料結構演算法
- 棧_單向連結串列
- 12.19單向連結串列
- 連結串列-雙向非通用連結串列
- 連結串列-單連結串列實現
- 結構與演算法(03):單向連結串列和雙向連結串列演算法
- 佇列_單向連結串列佇列
- 單向迴圈連結串列
- 10單向連結串列(slist)
- 單向連結串列的建立
- 簡單的單向連結串列
- 資料結構-單連結串列、雙連結串列資料結構
- 雙向連結串列
- 畫江湖之資料結構【第一話:連結串列】單向連結串列資料結構
- 畫江湖之資料結構 [第一話:連結串列] 單向連結串列資料結構
- 單連結串列
- 單向連結串列介面設計
- go 實現單向連結串列Go
- 單連結串列建立連結串列出現問題
- 連結串列-迴圈連結串列
- 資料結構實驗之連結串列九:雙向連結串列資料結構
- 單向迴圈連結串列大綱
- 單雙連結串列
- 連結串列4: 迴圈連結串列
- 【資料結構與演算法學習】線性表(順序表、單連結串列、雙向連結串列、迴圈連結串列)資料結構演算法
- 【LeetCode】->連結串列->通向連結串列自由之路LeetCode
- 連結串列入門與插入連結串列
- Leetcode_86_分割連結串列_連結串列LeetCode
- 實現雙向連結串列
- 演算法與資料結構-連結串列((linked-list)-Java實現單向連結串列演算法資料結構Java
- Python實現單向連結串列詳解Python
- 單向迴圈連結串列的介面程式
- 單向迴圈連結串列的實現
- 畫江湖之資料結構【第一話:連結串列】雙向連結串列資料結構
- 畫江湖之資料結構 [第一話:連結串列] 雙向連結串列資料結構