力扣刷题Day2

题目链接:

24. 两两交换链表中的节点 - 力扣(LeetCode)

效果:

解题思路:

给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。

注意不可以只是单纯的改变节点内部的值,而是需要实际的对两个节点交换。

那需要有一定的交换顺序,先让12交换,其中交换时的顺序为,先把2放在开头,然后让1指向2的下一个结点,然后2再接1

这里使用虚拟结点比较好。第一步就是让虚拟结点指向2,然后接着上述步骤

然后1和2交换完之后,再接着把指针移到3的位置,让虚拟结点的下一个为3,接着按上述步骤执行,直到没有需要交换的即可

文字版分析好了,现在来看代码

使用的语言为c语言:

cpp 复制代码
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* swapPairs(struct ListNode* head) {
    if(!head||!head->next)
    {
        return head;
    }
    struct ListNode* cur=(struct ListNode *)malloc(sizeof(struct ListNode));
    cur->next=head;
    struct ListNode* q=head;
    struct ListNode* p=cur;
    while(p&&q&&q->next)
    {
        p->next=q->next;
        q->next=p->next->next;
        p->next->next=q;


        p=q;//
        q=p->next;
    }

    return cur->next;
}

这个代码其中有很多地方需要注意:

1. 为什么要先建一个指针p来存储cur这个虚拟指针呢?

原因是------当转换链表后之前的head指针指向的不是链表的开头了,这时候要是返回head指针就不对了,而且如果只用cur指针的画,cur指针也在不断变换着,没办法保证返回的是整个链表。

2.为什么要让while循环的条件有q->next?

首先q是指向p指针的下一个结点的,而p结点是指向需要互换的第一个结点(就比如1、2中的1和3、4中的3)

在某种情况下(12345的情况),如果把3、4交换完,则p指向3,q指向5,5是不需要再交换的,这时候其实就可以退出了。所以条件上要加一个q->next

方法2:递归法:

这里由于每两个的步骤都是一样的,所以可以使用递归的方法来完成,当头结点不存在或者下一个结点不存在则不需要交换了。

cpp 复制代码
struct ListNode* swapPairs(struct ListNode* head){
    //头节点不存在或头节点的下一个节点不存在。此时不需要交换,直接返回head
    if(!head || !head->next)
        return head;
    //创建节点-指针类型来保存头结点下一个节点
    struct ListNode *newHead = head->next;
    //更改头结点加2位节点后的值,将头结点的next指针指向这个更改过的list
    head->next = swapPairs(newHead->next);
    //将新的头结点的next指针指向老的头节点
    newHead->next = head;
    return newHead;
}
相关推荐
CoovallyAIHub16 分钟前
不看异常,怎么学会识别异常?用“异常”指导异常检测!——NAGL方法解析(附代码地址)
深度学习·算法·计算机视觉
共享家952738 分钟前
数据结构-并查集
数据结构·c++·算法
IT古董1 小时前
【第五章:计算机视觉-项目实战之推荐/广告系统】2.粗排算法-(2)理解粗排模型之离线部分:双塔模型结构精讲及实现
人工智能·算法·计算机视觉
茉莉玫瑰花茶1 小时前
贪心 - 后篇
算法
m0_748233641 小时前
【C++篇】C++11入门:踏入C++新世界的大门
java·c++·算法
lxmyzzs1 小时前
【图像算法 - 31】基于深度学习的太阳能板缺陷检测系统:YOLOv12 + UI界面 + 数据集实现
人工智能·深度学习·算法·yolo·缺陷检测
lxmyzzs1 小时前
【图像算法 - 32】基于深度学习的风力发电设备缺陷检测系统:YOLOv12 + UI界面 + 数据集实现
深度学习·算法·yolo·计算机视觉
on_pluto_2 小时前
GAN生成对抗网络学习-例子:生成逼真手写数字图
人工智能·深度学习·神经网络·学习·算法·机器学习·生成对抗网络
Q741_1472 小时前
C++ 分治 快速排序优化 三指针快排 力扣 面试题 17.14. 最小K个数 题解 每日一题
c++·算法·leetcode·快排·topk问题
学学学无无止境2 小时前
将有序数组转换为二叉搜索树-力扣
leetcode