首页 > 代码库 > Reorder List

Reorder List

思路:对列表后半部分逆序排列,然后连接。其中还是需要注意head = cur;cur = cur->next;head->next = tmpNode;相对位置。

/**
 * 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) {
        ListNode dummy(-1);
        dummy.next = head;
        
        int count = 0;
        while(head)
        {
            head = head->next;
            ++count;
        }
        
        head = &dummy;
        for(int i=0; i<count/2 + count%2; ++i)
            head = head->next;
        ListNode *tmp = head->next;
        head->next = nullptr;
        
        //reverse the second half
        ListNode *cur = nullptr;
        while(tmp)
        {
            ListNode *tmpNode = tmp->next;
            tmp->next = cur;
            cur = tmp;
            tmp = tmpNode;
        }
        
        for(head = dummy.next; head&&cur;)
        {
            ListNode *tmpNode = head->next;
            head->next = cur;
            head = cur;
            cur = cur->next;
            head->next = tmpNode;
            head = tmpNode;
        }
        head = dummy.next;
    }
};

 

Reorder List