Java如何實(shí)現(xiàn)鏈表指定區(qū)間內(nèi)的節(jié)點(diǎn)翻轉(zhuǎn)
題目要求:給定一個(gè)鏈表,實(shí)現(xiàn)算法,翻轉(zhuǎn)從位置 m 到位置 n 指定區(qū)間范圍內(nèi)的節(jié)點(diǎn)。約束條件為原地操作,不使用額外數(shù)據(jù)結(jié)構(gòu)輔助操作,即空間復(fù)雜度為 O(1);并且在一遍遍歷內(nèi)完成操作。算法實(shí)現(xiàn)步驟1.
題目要求:給定一個(gè)鏈表,實(shí)現(xiàn)算法,翻轉(zhuǎn)從位置 m 到位置 n 指定區(qū)間范圍內(nèi)的節(jié)點(diǎn)。約束條件為原地操作,不使用額外數(shù)據(jù)結(jié)構(gòu)輔助操作,即空間復(fù)雜度為 O(1);并且在一遍遍歷內(nèi)完成操作。
算法實(shí)現(xiàn)步驟
1. 聲明一個(gè)用于表示鏈表節(jié)點(diǎn)的靜態(tài)內(nèi)部類,通過(guò)該類對(duì)象可以構(gòu)建一條鏈表結(jié)構(gòu)。
2. 實(shí)現(xiàn)算法,翻轉(zhuǎn)鏈表指定區(qū)間內(nèi)的節(jié)點(diǎn)。為簡(jiǎn)化操作,算法需要?jiǎng)?chuàng)建一個(gè)虛擬的頭節(jié)點(diǎn)。具體實(shí)現(xiàn)如下:
- 找到翻轉(zhuǎn)區(qū)間的前一個(gè)節(jié)點(diǎn) prev 和后一個(gè)節(jié)點(diǎn) next
- 翻轉(zhuǎn)區(qū)間內(nèi)的節(jié)點(diǎn)
- 將翻轉(zhuǎn)后的節(jié)點(diǎn)鏈接到前后節(jié)點(diǎn)
3. 編寫一個(gè)函數(shù),將鏈表結(jié)構(gòu)轉(zhuǎn)變?yōu)橐粋€(gè)字符串,用于輔助本地測(cè)試。
4. 編寫本地測(cè)試主方法。
5. 運(yùn)行本地測(cè)試主方法,觀察控制臺(tái)輸出,符合預(yù)期,本地測(cè)試通過(guò)。
6. 平臺(tái)提交算法,測(cè)試通過(guò)。
核心代碼實(shí)現(xiàn)
```java
/
* 翻轉(zhuǎn)鏈表指定區(qū)間內(nèi)的節(jié)點(diǎn)
* @param head 鏈表頭節(jié)點(diǎn)
* @param m 起始位置
* @param n 結(jié)束位置
* @return 翻轉(zhuǎn)后的鏈表頭節(jié)點(diǎn)
*/
public ListNode reverseBetween(ListNode head, int m, int n) {
// 創(chuàng)建虛擬頭節(jié)點(diǎn)
ListNode dummy new ListNode(0);
head;
// 找到翻轉(zhuǎn)區(qū)間的前一個(gè)節(jié)點(diǎn) prev 和后一個(gè)節(jié)點(diǎn) next
ListNode prev dummy;
for (int i 0; i < m - 1; i ) {
prev ;
}
ListNode next prev;
for (int i 0; i < n - m 1; i ) {
next ;
}
// 翻轉(zhuǎn)區(qū)間內(nèi)的節(jié)點(diǎn)
ListNode left ;
ListNode right ;
reverseList(left, right);
right;
return ;
}
/
* 翻轉(zhuǎn)鏈表指定區(qū)間內(nèi)的節(jié)點(diǎn)
* @param head 翻轉(zhuǎn)區(qū)間的頭節(jié)點(diǎn)
* @param tail 翻轉(zhuǎn)區(qū)間的尾節(jié)點(diǎn)
* @return 翻轉(zhuǎn)后的頭節(jié)點(diǎn)
*/
private ListNode reverseList(ListNode head, ListNode tail) {
ListNode prev tail;
ListNode curr head;
while (curr ! tail) {
ListNode next ;
prev;
prev curr;
curr next;
}
return prev;
}
```