Bootstrap

【力扣专题栏】重排链表,如何实现链表里面节点之间的交换?

在这里插入图片描述

1、题目描述+解释

在这里插入图片描述

主要就是实现:第一个节点和最后一个节点交换,第二节点和倒数第二个节点交换,依次交换下去。

2、算法原理解析

在这里插入图片描述

3、代码编写

class Solution {
public:
    void reorderList(ListNode* head) {
        //先找到中间节点
        ListNode* slow=head,*fast=head;
        while(fast&&fast->next)
        {
            slow=slow->next;
            fast=fast->next->next;
        }
        //此时把链表从slow->next节点分为两个链表
        ListNode* cur1=head;
        ListNode* cur2=slow->next;
        //把slow->next节点的后面断开
        slow->next=nullptr;

        //把后面的链表逆序一下
        ListNode* new_head2=new ListNode(0);
        while(cur2)
        {
            ListNode* next=cur2->next;
            cur2->next=new_head2->next;
            new_head2->next=cur2;
            cur2=next;
        }
        //此时已有两个链表
        //合并
        cur2=new_head2->next;
        ListNode* NewHead=new ListNode(0);
        ListNode* ptail=NewHead;
        while(cur1)
        {
            ptail->next=cur1;
            ptail=cur1;
            cur1=cur1->next;
            if(cur2)
            {
                ptail->next=cur2;
                ptail=cur2;
                cur2=cur2->next;
            }
        }
    }
};
;