小工具知识网

当前位置: 首页 > 行业知识 > 力扣难题:重排链表

行业知识

力扣难题:重排链表

2026-11-15 21:44:48 来源:互联网转载

首先通�index.php/tags-41973.html" >�快慢指针找到中间节点,然后将中间节点之后和之前的部分分为两个链表,然后翻转后面的链表,注意方法,然后将两个链表交替链接。

/** * Definition for singly-linked list. * struct ListNode { *     int val; *     ListNode *next; *     ListNode() : val(0), next(nullptr) {} *     ListNode(int x) : val(x), next(nullptr) {} *     ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */class Solution {public:    void reorderList(ListNode* head) {        if(!head||!head->next)            return;        ListNode *fast=head,*low=head;        ListNode *pre=nullptr,*cur=nullptr,*next=nullptr;        while(fast->next!=nullptr){            fast=fast->next;            if(fast->next)                fast=fast->next;//如果不是最后一个就走两步            low=low->next;        }        //当快指针到头,慢指针位置就是链表中间位置,cur指向后半段第一个        cur=low->next;        //不断开前半段的指针,会报错内存异常        low->next=nullptr;        //翻转从cur到结尾的链表部分        while(cur){            next=cur->next;            cur->next=pre;            pre=cur;            cur=next;        }        //此时pre指向后半段翻转过的链表头,head是前半段的链表头        //将pre的链表插入到head的链表间隔中        cur=head;        while(cur&&pre){            ListNode *temp=pre->next;//保存pre的下一个            pre->next=cur->next;            cur->next=pre;            cur=pre->next;            pre=temp;        }    }};

上一篇:IPv6的实用之处,探索其强大功能与未来潜力

下一篇:揭秘百度滑动验证开启秘籍!