力扣题目链接:https://leetcode.cn/problems/reorder-list/
给定一个单链表 L 的头节点 head ,单链表 L 表示为:
L0 → L1 → … → Ln - 1 → Ln
请将其重新排列后变为:
L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …
不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例 1:

输入:head = [1,2,3,4] 输出:[1,4,2,3]
示例 2:

输入:head = [1,2,3,4,5] 输出:[1,5,2,4,3]
提示:
[1, 5 * 104]1 <= node.val <= 1000遍历链表,将链表节点存入哈希表中,映射关系为<[第几个节点, 节点]>(其实这里使用数组也可以,虽然复杂度相同,但是数组的实际开销还是要小一些)
然后,用两个指针 l l l和 r r r,分别指向前面该处理的节点和后面该处理的节点
当前指针超过后指针时,退出循环。
注意事项:
class Solution {
public:
void reorderList(ListNode* head) {
unordered_map<int, ListNode*> ma;
int cnt = 0;
while (head) {
ma[cnt++] = head;
head = head->next;
}
head = ma[0]; // head归位
int l = 1, r = cnt - 1; // 待指定
bool front = false;
while (l <= r) {
if (front) {
head->next = ma[l++];
front = false;
}
else {
head->next = ma[r--];
front = true;
}
head = head->next;
}
head->next = nullptr; // 最后一个节点的next置空
}
};
同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/126031446