重排链表:1→n-1→2→n-2→…
目录
1. 关键点
- 一个单链表只能从头部向尾部遍历节点,无法从尾部开始向头部遍历节点
- 所以可以使用栈:
- 头到尾的顺序让链表节点入栈
- 那么==出栈顺序==就是反过来从尾到头了
- 所以可以使用栈:
2. 总结
- 以 1 → 2 → 3 → 4 为例
- 定义变量:
- p:
- 复用一个就好,重新指向即可
- s
- 约定,代表栈
- head 、next 、last
- head 指向 1
- next 指向 2
- last 代表最后一个
- 搞清楚他们应该互相怎么指向
- p:
- 还是要==自己画画图==
- break 条件:
- if (last === next || last.next === next) {
- 定义变量:
不需要使用虚拟节点
3. 代码
var reorderList = function (head) {
let s = [];
let p = head;
while (p) {
s.push(p);
p = p.next;
}
// 重新指向 head = 1
p = head;
// 以 1 → 2 → 3 → 4 为例
while (p) {
// next = 2
let next = p.next;
// last = 4
let last = s.pop();
if (last === next || last.next === next) {
last.next = null;
break;
}
// 1 → 4
p.next = last;
// 4 → 2
last.next = next;
// 前进 p 指向 2
p = next;
}
};