每周一道算法题(二十)

本周题目难度"Medium",碎片化的时间加起来,我大概用了三个小时吧,还是看财务学习视频的时候突然有了想法(学习的效率多低,唉。。。)

题目:给你一个单链表,要求你将链表相临的两个节点交换后返回。即第一个节点和第二个节点交换,第三个节点和第四个节点交换。。。要是最后剩了一个奇数节点就不用换了

思路:这题还需要思路么?就两两交换,小学生都会,只是代码实现就比较纠结了,所以直接来看代码吧(效率一般):

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* swapPairs(struct ListNode* head) {
    //如果给的是空链,直接返回
    if (head == NULL) return head;
    //若是单节点链表,也直接返回
    if (head->next == NULL) return head;
    //将第二个节点作为新头部
    struct ListNode* newHead = head->next;
    struct ListNode* result = newHead;
    //将原头节点的下一个节点指向原第三个节点
    head->next = head->next->next;
    //将新节点的第二个节点置为原头节点,至此,头节点和第二个节点就交换完成了
    result->next = head;
    //移动到第二个节点处
    result = result->next;
    //如果第三个节点不为空(为了方便注释,我就按第一次执行来说)
    while(result->next != NULL) {
        //如果第四个节点不为空
        if (result->next->next != NULL) {
            //记录第三个节点
            struct ListNode* temp1 = result->next;
            //将第四个节点置为新的第三个节点
            result->next = result->next->next;
            //移到下一个节点
            result = result->next;
            //记录第五个节点(是NULL也无所谓)
            struct ListNode* temp2 = result->next;
            //将第四个节点置为原第三个节点
            result->next = temp1;
            //移到下一个节点
            result = result->next;
            //拼接第五个节点,至此,第三个和第四个节点交换完成
            result->next = temp2;
        //如果没有第四个节点(最后一个是奇数节点),直接返回
        }else return newHead;
    }
    return newHead;
}

方法有很多,我写的还是比较low的,小伙伴可以开动大脑,多写几种。

版权声明:本文为 Crazy Steven 原创出品,欢迎转载,转载时请注明出处!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本周题目难度级别"hard" 题目:给你一个单向链表和一个数字k,要求将链表的每k个节点进行倒置,如链表为[1,2...
    CrazySteven阅读 4,079评论 0 3
  • 上周的算法题太难了,没做出来,哈哈,这周的题目难度级别是“Medium” 题目:给你一个组合,找出全排列中的下一个...
    CrazySteven阅读 4,350评论 0 2
  • 由于本周的题目比较简单,又很相似,于是就来上两道吧,两道题的难度级别都是"Easy" 题目:给一个有序的数组,将其...
    CrazySteven阅读 3,952评论 1 4
  • 本周的题目难度级别'Medium' 题目:本周的题目又是一道造轮子的题,就是不用‘*’和‘/’来实现除法。 思路:...
    CrazySteven阅读 3,677评论 0 2
  • 本周题目难度'Medium',所以还是用C来写,其实C和Python差不多,能用C写的,个人感觉用Python更好...
    CrazySteven阅读 4,490评论 3 2

友情链接更多精彩内容