Reverse Second Half of Linked List
[] -> []
[1] -> [1]
[1,2] -> [1,2]
[1,2,3] -> [1,2,3]
[1,2,3,4] -> [1,2,4,3]
[1,2,3,4,5] -> [1,2,3,5,4]
這道題比較tricky,要考慮的情況比較多。
1. 如果這個list有偶數個node,那很好辦,后半部分reverse就可以。
2 如果這個list有奇數個node, 比如: [1,2,3,4,5]?
可以reverse成[1,2,5,4,3] 也可以reverse成[1,2,3,5,4] 看對middle element的定義了。
還有一個問題, 如果我們要reverse second half list, 我們怎么也得從后半部分的list頭開始往后處理吧。 那怎么知道頭在哪里,也就是說怎么知道middle point在哪里?
還是用雙指針的辦法。假設一個人A每次走2步,一個人B每次走1次。 當A走到終點的時候,B就在跑道的中間位置。 【不過由于list可以奇數的兩種情況,我們還需要做一個condition check】
另外一個重要注意的地方: 如果是reverse list的某個部分,你得從這個部分的頭的前一個開始執行。
例如 a-->b-->c--->d--->e ?如果我們想reverse成 ?a-->b--->c-->e--->d 那么我們得有一個人站在c,然后操縱后面兩個人reverse。 這樣c.next 才可以接到后面reverse list的頭。如果我們直接從要reverse的list的頭開始處理,也就是e開始, 那么當我們成功處理成d-->e時候,由于沒有c的索引,沒法把它和前半部分的list連起來。
核心:其實就是把后面的東西不斷放到middle 指針的下一個位置。