要求:
輸入乙個單鏈表,輸出此煉表中的倒數第 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...