143. 重排链表
题目链接
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reorder-list/submissions/
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题目分析
- 数组
双指针
链表放进数组中,然后通过双指针法,一前一后,来遍历数组,构造链表。
class Solution {
public:
void reorderList(ListNode* head) {
vector<ListNode* > vec;
ListNode* cur = head;
while(cur){
vec.push_back(cur);
cur = cur->next;
}
cur = head;//初始值第一个
int n = vec.size();
int left = 1, right = n - 1;//初始值已经放入最左边的头节点了,所以left从1开始
while(left <= right){
cur->next = vec[right--];
cur = cur->next;
cur->next = vec[left++];
cur = cur->next;
}
cur->next = nullptr;
}
};
- 双向队列
链表放进双向队列,然后通过双向队列一前一后弹出数据,来构造新的链表。这种方法比操作数组容易一些,不用双指针模拟一前一后。
class Solution {
public:
void reorderList(ListNode* head) {
deque<ListNode* > que;
ListNode* cur = head;
while(cur){
que.push_back(cur);//队列不放入head节点
cur = cur->next;
}
que.pop_front();
cur = head;//注意已经放入的节点
int count = 0;//此种方法,每次加入一个节点,避免偶数个链表
while(que.size()){
//每次循环添加一个
if(count % 2 == 0){
cur->next = que.back();
que.pop_back();
}else{
cur->next = que.front();
que.pop_front();
}
count++;
cur = cur->next;
}
cur->next = nullptr;
}
};