经典算法题---链表奇偶重排(好题)&&双指针系列


我听别人说这世界上有一种鸟是没有脚的,它只能够一直的飞呀飞呀,飞累了就在风里面睡觉,这种鸟一辈子只能下地一次,那一次就是它死亡的时候。——《阿甘正传》

这一文章讲解链表的奇偶排序问题,这是一道不难但是挺好的链表题目,有一些题目就是基于奇偶排序拓展出来的。

目录:
一.原题
二.双指针在链表中的应用
三.具体思路与做法
四.具体代码

一.原题

接下来给出原题,以供大家思考:

二.双指针在链表中的应用

双指针的作用:由于单向链表(如上图)的每一个指针只能从头往后扫描,并不能从后往前的这一个局限性。所以,我们在解决单向链表的题目上,引入双指针。双指针指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个指针(特殊情况甚至可以多个),两个指针或是同方向访问两个链表,或是同方向访问一个链表(快慢指针)、或是相反方向扫描(对撞指针),从而建立一种手段,让这种手段为我们的目的服务。

三.具体思路与做法

1.具体思路:

ps:odd 奇数 ; even偶数
设:odd=head;(odd指向head也即结点1)
even=head->next;(even指向结点2)
xianjie=head->next(用来连接两个奇偶链表)

如下图所示,第一个结点是奇数位,第二个结点是偶数,第二个结点后又是奇数位。因此可以断掉结点1和结点2之间的连接,让结点1指向结点2的后面即结点3。代码也即(odd->next=even),如红色箭头。如果此时我们将第一个结点指向第三个结点,代码也即(odd=odd->next),就可以得到那么第三个结点后为偶数结点,因此我们又可以断掉结点2到结点3之间的连接,指向结点3后一个结点即结点4,代码也即(even->next=odd->next)如蓝色箭头。那么我们再将第二个结点指向第四结点,代码也即(even=even->next),接下来就是循环这一整个步骤,直到快指针(odd为NULL)。

2.具体做法:

  • step 1:判断空链表的情况,如果链表为空,不用重排。

  • step 2:使用双指针odd和even分别遍历奇数节点和偶数节点,并给偶数节点链表一个头。

  • step 3:上述过程,每次遍历两个节点,且even在后面,因此每轮循环用even检查后两个元素是否为NULL,如果不为再进入循环进行上述连接过程。

  • step 4:将偶数节点头接在奇数最后一个节点后,再返回头部。

四.具体代码

 ListNode* oddEvenList(ListNode* head) {
             //边界治理
        if (head == nullptr || head->next == nullptr)return head;
        ListNode* odd = head;
        ListNode* even = head->next;
        ListNode* xianjie = head->next;
        while (even->next != nullptr && even != nullptr) {
            odd->next = even->next;
            odd = odd->next;
            even->next = odd->next;
            even = even->next;
        }
        odd->next = xianjie;//奇数的最后一个结点指向第二个结点(偶数结点)形成奇偶序列
        return head;

        }
    
};

大家加油。。。。。最近在做算法题目考研关注我,点个赞,有问题可以一起讨论。以后的几篇文章都讲解链表题目。

评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力进大厂的新青年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值