LeetCode: 143. Reorder List
题目描述
Given a singly linked list L: L0→L1→…→Ln-1→Ln
,
reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→…
You may not modify the values in the list’s nodes, only nodes itself may be changed.
Example 1:
Given 1->2->3->4, reorder it to 1->4->2->3.
Example 2:
Given 1->2->3->4->5, reorder it to 1->5->2->4->3.
解题思路 —— 递归求解
- 用
vector
记录链表上的所有节点 - 递归构造指定顺序的链表
AC 代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
private:
// 构造指定顺序的链表
// 输入:const vector<ListNode*>& nodes, 待处理的节点
// int front, 正在处理的前面的节点
// int back, 正在处理的尾部的节点
// ListNode*& head, 返回的节点在链表中的位置
// bool isFront, 正在处理节点的位置
void reorderListByVetcor(const vector<ListNode*>& nodes, int front, int back,
ListNode*& head, bool isFront = true)
{
if(front > back) return;
if(isFront == true)
{
// 尾插法插入前面的节点
nodes[front]->next = nullptr;
head = nodes[front];
reorderListByVetcor(nodes, front+1, back, head->next, false);
}
else
{
// 尾插法插入后面的节点
nodes[back]->next = nullptr;
head = nodes[back];
reorderListByVetcor(nodes, front, back-1, head->next, true);
}
}
public:
void reorderList(ListNode* head) {
vector<ListNode*> nodes;
// 保存链表中的节点
while(head != nullptr)
{
nodes.push_back(head);
head = head->next;
}
head = nullptr;
reorderListByVetcor(nodes, 0, nodes.size()-1, head);
}
};