概念:鍊錶是一種物理儲存結構上非連續、非順序的儲存結構,資料元素的邏輯順序是通過鍊錶中的引用鏈
接次序實現的 。
實際中煉表的結構非常多樣,以下情況組合起來就有8種鍊錶結構:
單向、雙向
帶頭、不帶頭
迴圈、非迴圈
下面將介紹最常用的三種
第一種 無頭單向非迴圈的單鏈表:
無頭單向非迴圈單鏈表如上圖所示,存有資料以及指向下乙個資料的指標,具體**實現如下:
(1).先定義單鏈表內每乙個節點的屬性
(2).頭插法,每插入乙個節點都令它成為頭結點class node
}private node head; //定義頭結點
public mysinglelist()
(3).尾插法,將每乙個插入的新節點都插到原本節點的最後乙個
public void addlast(int data) else
//cur所指向的位置就是尾節點
(4).在指定索引處插入新的節點,這個時候必須要先檢驗給定的索引是否合法同時保證加入後不超出規定的單鏈表長度;
然後找到指定位置的資料,
首先檢查索引問題;
private void checkindex(int index)
}
然後檢索到指定索引位置
private node searchindex(int index)
return cur;
}
最後插入
(5).檢查是否包含某個資料
public boolean contains(int key)
cur = cur.next;
}return false;
}
(6).刪除單鏈表中第乙個指定資料
此時,先找到單鏈表中的指定資料的節點位置,然後將此節點的前乙個節點記憶體的指向下乙個節點的指標指向指定節點的下乙個節點即可;
先找到指定節點
//查詢關鍵字key的前驅
//如果找不到返回null
private node searchpre(int key)
while(pre.next != null)
pre = pre.next;
}return null;
}
然後刪除節點
public int remove(int key)
//是頭結點的時候
if(pre == head && pre.data == key)
node del = pre.next;
olddata = del.data;
pre.next = del.next;
return olddata;
}
(7)刪除含指定資料的所有節點
相對來說簡單一些,就是找到與指定資料相同的資料節點,跳過直接指向下乙個節點即可
public void removeallkey(int key)
node pre = this.head;
node cur = this.head.next;
while(cur != null) else
}if(this.head.data == key)
}
(8).逆置單鏈表所有節點
直接將方向改變;
無頭單向非迴圈單鏈表還有許多可考的面試題,本文僅說到這裡 ,之後會接著更新~
單鏈表解析
定義 typedef char listdata typedef struct node listnode typedef listnode linklist linklist first 定義頭指標 linklist last 定義尾指標1.清空鍊錶 刪除除頭結點外所有節點 void emptyl...
單鏈表 解決josephus問題
此 僅供個人學習之用 singlelinkedlist singlelinkedlist.h ifndef singlelinkedlist h h define singlelinkedlist h h templateclass listnode templateclass list list ...
約瑟夫問題 迴圈單鏈表解法
m prear 是指向單鏈表的尾部的指標。m prear m next 是指向頭指標。函式ysf就是對約瑟夫問題的求解方法函式。includeusing namespace std include stdlib.h define n 13 template class node node typen...