獲取單鏈表節點的個數:
1 獲取單鏈表節點的個數:(這個題比較簡單)
思路:使用while遍歷節點,只要temp!=null就是有效節點
// 面試題1:求單鏈表中有效節點的個數(不統計頭節點)
public
static
intgetlength
(heronode head)
//新增乙個輔助節點
heronode temp = head.next;
//不統計頭節點
int lenth =0;
while
(temp != null)
return lenth;
}
思路分析:
1 首先編寫乙個方法接受head(頭節點)節點。同時也要接受k(index)引數
2 接著把鍊錶從頭到尾遍歷一遍,得到有效位數size
3 最後我們從鍊錶的第乙個開始遍歷到(size - k)就得到倒數第k個節點啦!
// 面試題2:查詢單鏈表中的到底第k個節點
/** *
* @param head 頭節點,用於查詢鍊錶中的有效位數
* @param index 倒數第k個節點
* @return
*/public
static heronode findlastindexname
(heronode head,
int index)
//查詢鍊錶中的有效位數,節點的長度
int size =0;
heronode temp = head.next;
while
(temp != null)
// int size = getlength(head);//呼叫上面方法啊也可以
heronode cur = head.next;
//重新做乙個是因為temp此時是null 迴圈的時候會報空指標異常
//對於index做乙個校驗
if(index <=
0|| index > size)
//我們使用for迴圈進行遍歷到(size -index),表示temp.next後移幾次
for(
int i =
0; i < size - index; i++
)return cur;
}
3 單鏈表的反轉;(這個題有點麻煩)
思路:實現效果如圖1所示
1 首先先定義乙個節點 reversehead = new heronode();,用作當作儲存取出來節點的容器
2 接著從頭到尾遍歷原來的鍊錶,每遍歷乙個節點,都將其取出,放在新節點的前端(實現原理也就是把reversehead.next = 取出的節點)【請看圖二】
3 接著把reversehead後面的資料放在原來鍊錶上,也就是head.next = reversehead.next
public
static
void
reverselist
(heronode head)
//定義乙個輔助變數,幫助我們遍歷原來的鍊錶
heronode cur = head.next;
heronode next = null;
//指向當前節點cur的下乙個節點
heronode reversehead =
newheronode(0
,"",""
);//reversehead的頭節點
//遍歷原來的鍊錶,每遍歷乙個節點,將其取出,並放在新節點的最前端
while
( cur!= null)
//將head.next 指向 reversehead.next ,完成鍊錶的反轉;
head.next = reversehead.next;
}
4 逆序列印鍊錶:兩個方法
第乙個方法:使用反轉再列印【不建議,破壞了原本鍊錶的資料結構】 第二個方法:利用棧的特點(先進後出)列印
// 面試題四:從尾到頭列印單鏈表(使用棧的先進後廚原則)
public
static
void
reverseprint
(heronode head)
//建立乙個棧,存入節點
stack
stack =
newstack
<
>()
; heronode cur = head.next;
//遍歷鍊錶,並壓入棧中
while
(cur != null)
//將棧中的節點列印出來,也就是出棧
while
(stack.
size()
>0)
}
最後把 鍊錶的節點類、和鍊錶的管理類放在下面,學習程式設計還是需要動一動,加油!
/**
* 定義heronode,每乙個heronode都是乙個節點
*/class
heronode
@override
public string tostring()
';}
/**
* 定義乙個singlinkedlist來管理英雄人物,成為單鏈表
*/class
singlinkedlist
//新增方法(把節點新增到這個singlinkedlist列表)
//思路分析:先找到當前鍊錶的最後乙個節點,然後把最後節點的next域指向新的節點(不考慮排序的情況下)
public
void
add(heronode heronode)
//沒有找到,就接著移動查詢
temp = temp.next;
}// 當退出while迴圈的時候,temp就是指向鍊錶的最後(把新的節點新增進去)
temp.next = heronode;
}//有順序的新增操作
public
void
addbyorder
(heronode heronode)
if(temp.next.no > heronode.no)
else
if(temp.next.no == heronode.no)
temp = temp.next;
//後移一位,相當遍歷}if
(flag)
else
}//修改鍊錶資訊,但是編號no不能修改
public
void
update
(heronode newheronode)
//輔助接點
heronode temp = head.next;
boolean flag =
false
;//用於判斷節點是否存在
while
(true)if
(temp.no == newheronode.no)
temp = temp.next;}if
(flag)
else
}// 鍊錶的刪除操作
public
void
delete
(int no)
if(temp.next.no == no)
temp = temp.next;
//後移一位,用於遍歷}if
(flag)
else
}//查詢操作
public
void
select
(int no)
if(temp.no == no)
temp = temp.next;
//後移}if
(flag)
else
}// 顯示鍊錶 思路:遍歷
public
void
list()
//1 同樣需要乙個輔助節點(temp)遍歷,因為頭節點不可以用
heronode temp = head.next;
//2 遍歷
while
(true
)// 輸出節點的資訊
system.out.
println
(temp)
;// 將下乙個節點後移
temp = temp.next;}}
}
如果本文對你對鍊錶的認識有所幫助,請給我乙個贊?,是我最大的鼓勵! 單鏈表中的環(總結)
當fast和slow相遇時,slow還沒有走完鍊錶,假設fast已經在環內迴圈了n 1 n 圈。假設slow走了s步,則fast走了2s步,又由於 fast走過的步數 s n r s 在環上多走的n圈 則有下面的等式 2 s s n r 1 s n r 2 如果假設整個鍊錶的長度是l,入口和相遇點的...
帶環單鏈表及單鏈表的相交
帶環單鏈表的概念 當單鏈表的尾指標指向了鍊錶上任一非尾結點時,即生成了乙個帶環單鏈表。問題一 判斷是否帶環 通過快慢指標實現判斷,注意快指標必須是兩步,慢指標必須是一步,否則可能跨過 問題二 求環的入口點 通過數學思想,方法是使用一指標指向開頭,一指標指向環中的相交點,每次各走一步,如此所得相交點即...
單鏈表操作總結
這幾天看歐立奇的 程式設計師面試寶典 發現其中單鏈表的建立的程式存在錯誤,特別改正如下,原書的程式求的鍊錶的長度要比正確的單鏈表的長度要多1。在寫程式時候,要特別注意if和while的區別。下面的程式是單鏈表的建立 插入 刪除 逆序 排序 測長等程式 全部都除錯通過 存在的問題在於,將鍊錶的頭指標看...