行业知识
力扣难题:重排链表
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; } }};
下一篇:揭秘百度滑动验证开启秘籍!