反轉從位置 m 到 n 的鍊錶。請使用一趟掃瞄完成反轉。
說明:
1 ≤ m ≤ n ≤ 鍊錶長度。
示例:
輸入: 1->2->3->4->5->null, m = 2, n = 4
輸出: 1->4->3->2->5->null
問題分析
對於鍊錶的問題,根據以往的經驗一般都是要建乙個dummy node,連上原鍊錶的頭結點,這樣的話就算頭結點變動了,我們還可以通過dummy->next來獲得新鍊錶的頭結點。這道題的要求是只通過一次遍歷完成,就拿題目中的例子來說,變換的是2,3,4這三個點,我們需要找到第乙個開始變換結點的前乙個結點,只要讓pre向後走m-1步即可,為啥要減1呢,因為題目中是從1開始計數的,這裡只走了1步,就是結點1,用pre指向它。萬一是結點1開始變換的怎麼辦,這就是我們為啥要用dummy結點了,pre也可以指向dummy結點。然後就要開始交換了,由於一次只能交換兩個結點,所以我們按如下的交換順序:
1 -> 2 -> 3 -> 4 -> 5 -> null
1 -> 3 -> 2 -> 4 -> 5 -> null
1 -> 4 -> 3 -> 2 -> 5 -> null
我們可以看出來,總共需要n-m步即可,第一步是將結點3放到結點1的後面,第二步將結點4放到結點1的後面。這是很有規律的操作,那麼我們就說乙個就行了,比如剛開始,pre指向結點1,cur指向結點2,然後我們建立乙個臨時的結點t,指向結點3(注意我們用臨時變數儲存某個結點就是為了首先斷開該結點和前面結點之間的聯絡,這可以當作乙個規律記下來),然後我們斷開結點2和結點3,將結點2的next連到結點4上,也就是 cur->next = t->next,再把結點3連到結點1的後面結點(即結點2)的前面,即 t->next = pre->next,最後再將原來的結點1和結點2的連線斷開,將結點1連到結點3,即 pre->next = t。這樣我們就完成了將結點3取出,加入結點1的後方。第二步將結點4取出,加入結點1的後方,也是同樣的操作,這裡就不多說了,請大家自己嘗試下吧,參考**如下:
/**
* definition for singly-linked list.
* struct listnode
* };
*/class solution
return dummy->next;
}};
leetcode 92反轉鍊錶
反轉從位置 m 到 n 的鍊錶。請使用一趟掃瞄完成反轉。說明 1 m n 鍊錶長度。示例 輸入 1 2 3 4 5 null,m 2,n 4 輸出 1 4 3 2 5 null definition for singly linked list.public class listnode class...
LeetCode 92 反轉鍊錶 II
反轉從位置 m 到 n 的鍊錶。請使用一趟掃瞄完成反轉。說明 1 m n 鍊錶長度。示例 輸入 1 2 3 4 5 null,m 2,n 4 輸出 1 4 3 2 5 null 5ms definition for singly linked list.public class listnode c...
leetcode92 反轉鍊錶 II
反轉從位置 m 到 n 的鍊錶。請使用一趟掃瞄完成反轉。說明 1 m n 鍊錶長度。示例 輸入 1 2 3 4 5 null,m 2,n 4輸出 1 4 3 2 5 null思路 先往後遍歷找到需要反轉的節點作為起點 count m 然後按照劍指offer 反轉鍊錶 的思路,設定curr,pre,p...