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();
        }
    }
};

  

posted @ 2014-10-05 22:41  zombies  阅读(152)  评论(0编辑  收藏  举报