leetcode24刷题打卡

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

示例 1:

img

输入:head = [1,2,3,4]
输出:[2,1,4,3]

示例 2:

输入:head = []
输出:[]

示例 3:

输入:head = [1]
输出:[1]

提示:

  • 链表中节点的数目在范围 [0, 100]
  • 0 <= Node.val <= 100

题目思路:

​ 在独自做这道题的时候我有一个疑问,就是两个节点进行交换之后first->next = second->next; second->next=firstsecond节点的信息会丢失,那么怎么保存它呢,看了carl的题解之后,知道了虚拟结点的重要性,可以设置一个虚拟头结点,在每次访问节点的时候让头结点的下一个节点指向第二个节点,从解决问题

代码:

class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        ListNode *first = new ListNode();  //虚拟头结点  不会动
        first->next = head;
        ListNode *cur = first;  //拷贝一个虚拟头结点 用于移动
            while(cur->next&&cur->next->next){
            ListNode *tem = cur->next;  //保存第一节点
            ListNode * temp = cur->next->next->next; //保存即将跳转的节点

            cur->next = cur->next->next;  //将“头”结点 指向第二节点
            cur->next->next = tem;  //将第二节点指向第一节点
            cur->next->next->next = temp;  //将第一节点指向第三节点

            cur = cur->next->next;  //将“头”结点 转移至下一个头结点的位置
        }
        return first->next;
    }
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值