經典鍊錶演算法題(Java實現)

2021-09-20 12:48:40 字數 1861 閱讀 7434

要求:

輸入乙個單鏈表,輸出此煉表中的倒數第 k 個節點。

思路:

兩個指標指向頭節點,乙個指標先走k-1步,兩個指標一起往前走,當快指標走到最後時,慢指標指向的就是倒數第k個節點了

**:

static listnode findlastnode

(listnode head,

int k)

while

(pre.next!=null)

return last;

}

要求:把鍊錶反轉

思路:

遍歷整個鍊錶,在第乙個開始逐漸移除並新增到新的鍊錶,返回最後得到的新鍊錶

**:

//反轉鍊錶

static listnode reverse

(listnode head)

return pre;

}

補充:另外乙個方法:遍歷原鍊錶,把節點存到棧,出棧重新連線成新的鍊錶;

要求:

判斷鍊錶是否有環

思路:

快慢指標法,兩個指標乙個一次走一步,乙個一次走兩步,當兩指標相遇時,證明有環返回結果,最後當慢指標==null時證明無環

**:

//判斷鍊錶是否有環

static

boolean

circlelist

(listnode head)

return

false

;}

補充:另外乙個方法,遍歷鍊錶,把遍歷過的節點放到set裡面,出現新放的節點已經在set裡出現過了,證明有環

要求:

給乙個鍊錶,若其中包含環,請找出該鍊錶的環的入口結點,否則,輸出null。

思路:

同樣是快慢指標,快慢指標當他們能相遇時,證明有環,而且他們在環中相遇,快指標比慢指標多跑了k圈

設快指標走了2n步,慢指標走了n步,環節點數為r,所以2n = n + k * r,k為快指標走過的環的圈數

所以得:n = k * r

設頭節點到環的入口處的長度是x,入口處到相遇的位置為y,相遇處到入口處位置為z,可得:

上面等式左邊的n = x+y,

右邊的 k * r = (k-1)* r +y+z

得 x = (k-1)* r + z;

所以用其中乙個指標指向頭結點,兩個指標一起走,相遇的時候就是剛好走完了x到達了入口處

**:

//找到鍊錶環的入口

static listnode circlelist1

(listnode head)

//不相遇證明沒有環,返回null

if(slow!=fast)

return null;

//用其中乙個指標指向頭結點

slow = head;

while

(slow!=fast)

//當他們相遇的時候,相遇的節點就是環的入口處

return slow;

}

經典查詢演算法題(java實現)

要求 有序陣列找目標數字置 思路 經典二分思想 public static intfind int arr,int target,int left,int right return 1 找不到輸出 1 要求 查詢有序陣列相同數字的左邊界,如1 2 3 3 3 3 4,獲得左邊界為2,右邊界為5 思路...

JAVA經典演算法四題

程式4 題目 將乙個正整數分解質因數。例如 輸入90,列印出90 2 3 3 5。程式分析 對n進行分解質因數,應先找到乙個最小的質數k,然後按下述步驟完成 1 如果這個質數恰等於n,則說明分解質因數的過程已經結束,列印出即可。2 如果n k,但n能被k整除,則應列印出k的值,並用n除以k的商,作為...

鍊錶演算法題

leetcode鏈結 利用棧先入先出 definition for singly linked list.struct listnode class solution p head while p p head 需要找到頭節點的位置 return p 雙指標,畫 決 leetcode鏈結 class...