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 指针的下一个位置。