reorder list

来源:互联网 发布:淘宝恶意举报卖家售假 编辑:程序博客网 时间:2024/05/17 17:57

题目:
Given a singly linked list L: L0→L1→…→Ln-1→Ln,
reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→…
You must do this in-place without altering the nodes’ values.
For example,
Given{1,2,3,4}, reorder it to{1,4,2,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 == NULL || head->next == NULL)            return;        ListNode* slow = head, *fast = head;        //find the middle point        while (fast->next != NULL && fast->next->next != NULL)        {            slow = slow->next;            fast = fast->next->next;        }        //break and reverse the second half of list        fast = slow;        slow = slow->next;        fast->next = NULL;        slow = reverse(slow);        ListNode* curr = head;        while (curr->next)        {            ListNode* tmp = curr->next;            curr->next = slow;            slow = slow->next;            curr->next->next = tmp;            curr = tmp;        }        curr->next = slow;    }    ListNode* reverse(ListNode* head)    {        if (head == NULL || head->next == NULL)            return head;        ListNode* prev = head;        for(ListNode *curr = prev->next, *Next = curr->next; curr; )        {            curr->next = prev;            prev = curr;            curr = Next;            Next = Next ? Next->next : Next;        }        head->next = NULL;        return prev;    }};
0 0
原创粉丝点击