每日一题——两两交换链表中的节点

该文章介绍了一种解决编程问题的策略,涉及如何两两交换链表中的节点。通过创建新的表头,使用指针cur和prev遍历链表,每次循环交换相邻节点并更新指针位置,最后返回新表头的next,实现链表节点的两两交换。这种方法类似于反转链表的处理方式。
摘要由CSDN通过智能技术生成

每日一题

两两交换链表中的节点

题目链接

在这里插入图片描述

思路

  • 首先我们来理解题意:题目要求我们两两交换链表中的节点,即第1个和第2个,第3个和第4个……如果最后一个为单个节点(如节点情况为 1 2 3 4 5)那么就不进行处理。注意,题目要求的是对节点进行交换,而不是修改节点内的值。
  • 这道题其实和反转链表方法类似,我们可以先新建一个表头指向原来的表,从而确保交换第一个节点和第二个节点后还能返回链表的头,然后我们就可以定义一个指针cur来遍历链表,进行节点的两两交换就可以了

具体步骤

  • 新建一个表头newHead指向原来的表头head

  • 定义指针cur = head,prev = newHead(即cur的前一个节点),当cur和cur->next不为空时进行循环

  • 每次循环都定义一个temp = cur->next,对cur,temp,prev三个指针进行操作,从而实现节点的交换

  • 如图展示的就是交换第一组节点的过程

    在这里插入图片描述

  • 最后返回新头结点的next即可

实现代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* swapPairs(struct ListNode* head){
    //当链表为空或只有一个节点是,不要交换,直接返回原头节点
    if(head == NULL || head->next == NULL)
        return head;
    //建立新表头
    struct ListNode *newHead = (struct ListNode *)malloc(sizeof(struct ListNode));
    newHead->next = head;
    struct ListNode *cur = head, *prev = newHead;
    //当cur和cur->next都不为空时进行循环
    while(cur && cur->next)
    {
        struct ListNode *temp = cur->next;
        cur->next = temp->next;
        temp->next = cur;
        prev->next = temp;
        //交换完后更新prev和cur的位置
        prev = cur;
        cur = cur->next;
    }
    return newHead->next;	//返回表头
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Forward♞

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

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

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

打赏作者

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

抵扣说明:

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

余额充值