菜鸟成长逆袭之旅,爱好撸铁和撸代码,有强制的约束力,希望通过自己的努力做一个高品质人
Work together and make progress together
重排链表
给定一个单链表 L:L0→L1→…→Ln-1→Ln ,
将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→…
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例 1:
给定链表 1->2->3->4, 重新排列为 1->4->2->3.
示例 2:
给定链表 1->2->3->4->5, 重新排列为 1->5->2->4->3.
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
void reorderList(ListNode* head) {
if (!head || !head->next || !head->next->next) return ;
ListNode *fast = head,*slow = head;
while(fast->next && fast->next->next){
slow = slow->next;
fast = fast->next->next;
}
ListNode *mid = slow->next;
slow->next = NULL;
ListNode *last = mid, *pre = NULL;
while(last){
ListNode *next = last->next;
last->next = pre;
pre = last;
last = next;
}
while (head && pre){
ListNode *next = head->next;
head->next = pre;
pre = pre->next;
head->next->next = next;
head = next;
}
}
};
*/
class solution{
public :
void reorderList(ListNode *head){
if (!head || !head->next || !head->next->next) return ;
stack<ListNode *> st;
ListNode *cur = head;
while(cur){
st.push(cur);
cur=cur->next;
}
int cnt = ((int)st.size()-1)/2;
cur = head;
while (cnt-->0){
auto t = st.top(); st.pop();
ListNode* next = cur->next;
cur->next=t;
t->next = next;
cur = next;
}
st.top()->next = NULL;
}
};