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