143. 重排链表

发布时间 2023-06-28 16:46:59作者: xiazichengxi

给定一个单链表 L 的头节点 head ,单链表 L 表示为:

L0 → L1 → … → Ln - 1 → Ln
请将其重新排列后变为:

L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …
不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

示例 1:


输入:head = [1,2,3,4]
输出:[1,4,2,3]

> 代码1(前后队列)


class Solution {
public:
    void reorderList(ListNode* head) {
        deque<ListNode*> que;
        ListNode* cur = head;
        if (cur == nullptr) return;

        while(cur->next != nullptr) {
            que.push_back(cur->next);
            cur = cur->next;
        }

        cur = head;
        int count = 0; // 计数,偶数去后面,奇数取前面
        ListNode* node;
        while(que.size()) {
            if (count % 2 == 0) {
                node = que.back();
                que.pop_back();
            } else {
                node = que.front();
                que.pop_front();
            }
            count++;
            cur->next = node;
            cur = cur->next;
        }
        cur->next = nullptr; // 注意结尾
    }
};

> 代码2(快慢指针 反转链表)


class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        if(!head || !head->next) return head;
        ListNode* temp; // 保存cur的下一个节点
        ListNode* cur = head;
        ListNode* pre = NULL;
        while(cur) {
            temp = cur->next;  // 保存一下 cur的下一个节点,因为接下来要改变cur->next
            cur->next = pre; // 翻转操作
            // 更新pre 和 cur指针
            pre = cur;
            cur = temp;
        }
        return pre;
    }

    void reorderList(ListNode* head) {
        if(!head || !head->next) return;
        //首先用快慢指针 找到中间位置
        ListNode *slow,*fast;
        slow = head;
        fast = head;
        while(fast != nullptr && fast->next != nullptr){
            slow = slow->next;
            fast = fast->next->next;
        }
        ListNode* head1 = head;
        ListNode* head2;
        head2 = slow->next;
        slow->next = nullptr;
        // 对head2进行翻转
        head2 = reverseList(head2);
        //交替head1,head2
        ListNode *p,*q,*p1,*q1;
        p = head1;
        q = head2;
        p1 = p->next;
        if(q)  q1 = q->next;
        while(p && q){
            p->next = q;
            q->next = p1;

            p = p1;
            if(p)  p1 = p->next;
            q = q1;
            if(q)  q1 = q->next;
        }
    }
};