硬核操作链表步骤如下:
- 快慢指针,为了获取
[mid,len-1]下半段链表 - 链表翻转
- 归并两个链表,相互穿插
var reorderList = function (head) {
var len = 0;
for (var p = head; p !== null; p = p.next) {
len++;
}
var mid = len >> 1;
var fast = head,
slow = head;
for (var i = 0; i < mid; i++) {
fast = fast.next;
}
while (fast.next !== null) {
fast = fast.next;
slow = slow.next;
}
var prev = null;
var cur = slow;
var next = cur.next;
cur.next = null;
cur = next;
while (cur) {
var next = cur.next;
cur.next = prev;
prev = cur;
cur = next;
}
var p = head
while (prev) {
var next = p.next;
p.next = prev;
p = next;
var pNext = prev.next;
prev.next = p;
prev = pNext;
}
return p;
};
流程图分析