143. 重排链表
143. 重排链表
给定一个单链表 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
思路:
难点在于需要链表本身无法从尾部向前遍历,因此我们可以利用栈来进行从后向前遍历
class Solution {
public:
void reorderList(ListNode* head) {
//难点在于我们需要从尾部向前进行遍历,也就是先进后出,那么就要想到栈
stack<ListNode*>st;
ListNode* p=head;
if(head==nullptr)return;
while(p!=nullptr){//所有节点入栈
st.push(p);
p=p->next;
}
p=head;
while(p!=nullptr){
ListNode* last=st.top();
st.pop();//取出尾部节点
ListNode* p2=p->next;
if(last==p2||last->next==p2){
//偶数个节点或者奇数个节点的结束情况
last->next=nullptr;
break;
}
p->next=last;
last->next=p2;
p=p2;
}
}
};
本文来自博客园,作者:{BailanZ},转载请注明原文链接:https://www.cnblogs.com/BailanZ/p/16341290.html