c_cpp 给定单链表L:L0→L1→...→Ln-1→Ln,将其重新排序为:L0→Ln→L1→Ln-1→L2→Ln-2→......必须在不改变的情况下就地执行此操作节点

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 给定单链表L:L0→L1→...→Ln-1→Ln,将其重新排序为:L0→Ln→L1→Ln-1→L2→Ln-2→......必须在不改变的情况下就地执行此操作节点相关的知识,希望对你有一定的参考价值。

void reorderList(ListNode *head) {
    if(!head || !head->next) return;
    
    // step1: get middle node and its previous node, cut to 2 halves.
    ListNode *p = head, *q = head, *tail = NULL; // cannot write *q=head->next
    while(q && q->next) {             
        tail = p;
        p = p->next;
        q = q->next->next;
    }
    tail->next = NULL;  // gist1
    
    // step2: reverse the 2nd half
    ListNode *pre = NULL, *cur = p;
    while(cur) {
        ListNode *nxt = cur->next;
        cur->next = pre;
        pre = cur;
        cur = nxt;
    }
    
    // step3: merge the 2 halves
    ListNode *right_half = pre;
    ListNode *p1 = head, *p2 = right_half;
    bool use_left = false;  // gist2
    while(p1 && p2) {
        if(use_left == false) {
            ListNode *nxt = p1->next;
            p1->next = p2;
            p1 = nxt;
        }
        else if(use_left == true) {
            ListNode *nxt = p2->next;
            p2->next = p1;
            p2 = nxt;
        }
        use_left = !use_left;
    }
}

以上是关于c_cpp 给定单链表L:L0→L1→...→Ln-1→Ln,将其重新排序为:L0→Ln→L1→Ln-1→L2→Ln-2→......必须在不改变的情况下就地执行此操作节点的主要内容,如果未能解决你的问题,请参考以下文章

143. 重排链表

leetcode中等143重排链表

leetcode中等143重排链表

LeetCode——reorder-list

Leetcode No.143 重排链表

LeetCode 0143. 重排链表