頭插法和尾插法建立連結串列區別
單連結串列反轉是面試時經常會遇到的問題,之前只是在資料結構裡用虛擬碼實現過單連結串列反轉。為落實親手編寫每一個程式的目標,在這裡用java實現反轉。方法有很多,這裡只寫最優的。時間複雜度O(n),空間複雜度O(1)。也就是說不新開闢空間,原地反轉。
這篇部落格主要講述如何採用頭插和尾插兩種方法建立單連結串列。反轉連結串列見下一篇部落格。
不管採用哪種方法,首先應建立表頭,目的是使第一個實際節點和後面的節點是等同的,不會因為刪除、插入等操作區分開考慮。
頭插法:不斷的將新節點插入到表頭後面。
package singleLinklistReverse;
public class Creat {
//定義節點類
public class Lnode{
int data;
Lnode next;
}
public void creatLinklist(String s){
Lnode first=new Lnode();
first.next=null;
for(int i=0;i<s.length();i++){
Lnode lnode=new Lnode();
lnode.data=s.charAt(i)-'0';
lnode.next=first.next;
first.next=lnode;
}
Lnode p=first.next;
while(p!=null){
System.out.println(p.data);
p=p.next;
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner=new Scanner(System.in);
String s=scanner.nextLine();
Creat creat=new Creat();
creat.creatLinklist(s);
}
}
控制檯輸入:12345
輸出:5
4
3
2
1
看到輸出結果,大家就會知道頭插法會改變資料輸入順序。在嚴格要求資料順序不變時,可以用尾插法。
尾插法:新來的節點插入到當前節點末尾處。
package singleLinklistReverse_2;
import singleLinklistReverse.Reverse;
public class Creat {
//定義節點類
public class Lnode{
int data;
Lnode next;
// public Lnode(int d){
// this.data=d;
// }
}
//定義連結串列類
public class linkList{
}
/**
* 採用尾插法來建立單連結串列
* @param s 接收來自控制檯輸入的字串
*/
public void creatLinklist(String s){
Lnode first=new Lnode();
first.next=null;
Lnode r=first;
for(int i=0;i<s.length();i++){
Lnode lnode=new Lnode();
lnode.data=s.charAt(i)-'0';
r.next=lnode;
r=lnode;
}
r.next=null;
Lnode p=first.next;
while(p!=null){
System.out.println(p.data);
p=p.next;
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner=new Scanner(System.in);
String s=scanner.nextLine();
Creat creat=new Creat();
creat.creatLinklist(s);
}
}
結果:
12345
1
2
3
4
5
顯然尾插法穩定性更好。
相關文章
- Java解釋單連結串列中的頭插法以及尾插法Java
- 單連結串列的尾插,頭插,遍歷,查詢和插入
- 建立連結串列兩種方法的區別
- 插頭dp初探
- 影象縮放--插值法(opencv,原理)OpenCV
- 單連結串列從尾到頭輸出元素
- 陣列和連結串列的區別陣列
- 連結串列面試題(一)---刪除一個無頭單連結串列的非尾結點面試題
- 面試-陣列和連結串列的區別面試陣列
- nyc 插樁無法插樁使用裝飾器的程式碼,請問有什麼解決辦法嗎?
- 劍指offer-從尾到頭列印連結串列-phpPHP
- PatterNodes for Mac建立設計模式和插圖Mac設計模式
- Vue 模板語法第一式 —— 插值Vue
- 層次分析法 插值與擬合
- 翻轉連結串列常用寫法
- [每日一題] 第九題:從尾到頭列印連結串列每日一題
- 插頭DP學習筆記筆記
- 2. Vue語法--插值操作&動態繫結屬性 詳解Vue
- 《計算方法 》 - 第2章 插值法 - 解題套路
- 資料分析缺失值處理(Missing Values)——刪除法、填充法、插值法
- 普通法和大陸法的區別
- 雙向連結串列 尾節點插入
- 劍指Offer面試題5(Java版):從尾到頭列印連結串列面試題Java
- MATLAB一維插值和二維插值 比較Matlab
- 記憶體插槽插滿就可以了?不,你的插法很可能是錯誤的記憶體
- C++建立連結串列C++
- 連續插值,用forall實現。
- 插值演算法總結演算法
- 資料結構實驗之連結串列二:逆序建立連結串列資料結構
- “軟連結”和“硬連結”的區別
- 硬連結和軟連結的區別
- SCSS #{} 插值CSS
- 資料結構實驗之連結串列六:有序連結串列的建立資料結構
- 資料結構實驗之連結串列一:順序建立連結串列資料結構
- 帶頭結點的連結串列操作題
- Python實現連結串列反轉的方法【迭代法與遞迴法】Python遞迴
- 【原創】淺談指標(十)連結串列的寫法指標
- js 建立一條通用連結串列JS