單鏈表總結 單鏈表中的必不可少的面試題

2021-10-23 16:20:10 字數 4346 閱讀 9737

獲取單鏈表節點的個數:

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的區別。下面的程式是單鏈表的建立 插入 刪除 逆序 排序 測長等程式 全部都除錯通過 存在的問題在於,將鍊錶的頭指標看...