重排链表

来源:互联网 发布:apache spark 版本 编辑:程序博客网 时间:2024/05/20 02:28

给定一个单链表L: L0→L1→…→Ln-1→Ln,

重新排列后为:L0→Ln→L1→Ln-1→L2→Ln-2→…

必须在不改变节点值的情况下进行原地操作。

class Solution {public:    /**     * @param head: The first node of linked list.     * @return: void     */    void reorderList(ListNode *head) {        // write your code here        if(head == NULL){head = NULL;}        else{            ListNode *mid  = getmid(head);            ListNode *se   = mid->next;            mid->next      = NULL;            ListNode *fr   = head;            ListNode *rese = reverse(se);            head           = merge(fr,rese);        }    }    ListNode *reverse(ListNode *head){        ListNode *prev = NULL;        while(head != NULL) {            ListNode *temp = head->next;            head->next     = prev;            prev           = head;            head           = temp;        }        return prev;    }    ListNode *merge(ListNode *a,ListNode *b){        ListNode *dummy = new ListNode(0);        ListNode *p     = dummy;        while(a != NULL && b != NULL){            p->next = a;            a       = a->next;            p       = p->next;            p->next = b;            b       = b->next;            p       = p->next;        }        if(b != NULL){            p = b;        }        return dummy->next;    }    ListNode *getmid(ListNode *head){        ListNode *fast = head->next;        ListNode *slow = head;        while(fast != NULL && fast->next != NULL && fast->next->next != NULL){            fast = fast->next->next;            slow = slow->next;        }        return slow;    }};

注意点:1. reorder list这个函数没有返回值,因此使用if语句判断head是否等于NULL,后面的情况要用else语句。

0 0
原创粉丝点击