力扣同类题:重排链表
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; } } };
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。