单链表排序

Q:给出单链表L:L 0→L 1→…→L n-1→L n, 将其重新排序为:L 0→L n→L 1→L n-1→L 2→L n-2→…

例如:1->4->2->3->5->9
排序后:1->9->4->5->2->3

解题思路:

  • 从题意我们可以发现,排序是按照一首一尾、一首一尾来进行
  • 我们可以先找到中间节点,将链表分割为两个部分;再将后半部分链表进行反转;
  • 最后将后半部分反转后的链表插入前半部分链表

画图理解:
在这里插入图片描述
代码实现:

struct ListNode {
      int val;
      ListNode *next;
      ListNode(int x) : val(x), next(NULL) {}
 };

class Solution {
public:
    void reorderList(ListNode *head) {
        if(head==NULL||head->next==NULL)
            return;
        ListNode* slow=head;
        ListNode* fast=head;
        while(fast!=NULL&&fast->next!=NULL&&fast->next->next!=NULL)  //找中间节点
        {
            slow=slow->next;
            fast=fast->next->next;
        }
        ListNode* newhead=slow->next;
        slow->next=NULL;                //分割链表
        ListNode* prev=NULL;
        while(newhead)                 //反转后半部分链表
        {
            ListNode* next=newhead->next;
            newhead->next=prev;
            prev=newhead;
            newhead=next;
        }
        ListNode* n1=NULL;
        ListNode* n2=NULL;
        newhead=prev;
        ListNode* cur=head;
        while(cur!=NULL&&newhead!=NULL)        //合并链表
        {
            n1=cur->next;
            n2=newhead->next;
            cur->next=newhead;
            cur=n1;
            newhead->next=cur;
            newhead=n2;
        }
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值