LeetCode-Reorder List-链表重排序-链表和栈的应用
https://oj.leetcode.com/problems/reorder-list/
需要一个栈以每次取得链表尾部的结点。有了这个栈以后,这个问题就是一个链表操作问题。
对于链表的操作,需要在纸上画好每次需要调整哪些结点以及其next指针。并且一定要注意边界条件。
这个题目需要注意的是栈顶元素被重排序后,新的栈顶元素的next需要设置为NULL。然后需要注意循环的终止条件。
/** * 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==NULL){return;} stack <ListNode *> st; ListNode *p=head; while(p!=NULL){ st.push(p); p=p->next; } if (st.size()==1){return;} p=head; ListNode *q=st.top(); st.pop(); while(p->next!=NULL){ if (p->next==q){break;} ListNode *r=p->next; st.top()->next=NULL; p->next=q; q->next=r; p=r; q=st.top(); st.pop(); } } };