给定一个单链表 L 的头节点 head ,单链表 L 表示为:
L0 → L1 → … → Ln - 1 → Ln
请将其重新排列后变为:
L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …
不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
解题思路
- 首先先取链表的一半,设快慢指针获取链表的一半一半
- 快指针走2步,慢指针走一步
- 然后反转后半段
- 在每段各取一个节点连接
1 -> 2 -> 3 -> 4 -> 5 -> 6
^
|
lr
1 -> 2 -> 3 -> 4 -> 5 -> 6
^ ^
| |
l r
1 -> 2 -> 3 -> 4 -> 5 -> 6
^ ^
| |
l r
1 -> 2 -> 3 -> 4 -> 5 -> 6 -> null
^ ^
| |
l r
1 -> 2 -> 3 -> 4
5 -> 6 => 6 -> 5
1 -> 6 -> 2 -> 5 -> 3 -> 4
代码
var reorderList = function(head) {
let right = left = head;
while(right && right.next) {
left = left.next;
right = right.next.next;
}
right = reverse(left.next);
left.next = null;
left = head;
while (right) {
let lnext = left.next;
let rnext = right.next;
left.next = right;
right.next = lnext;
left = lnext;
right = rnext;
}
return head;
};
var reverse = function(head) {
let pre = null, cur = head;
while (cur) {
[cur.next, pre, cur] = [pre, cur, cur.next]
}
return pre;
}