首页 > 编程语言 >leetcode24 两两交换链表中的节点(swap-nodes-in-pairs)

leetcode24 两两交换链表中的节点(swap-nodes-in-pairs)

时间:2024-10-01 16:01:11浏览次数:1  
标签:pairs 交换 head next 链表 swap node1 节点

题目描述:

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

示例 1:

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

示例 2:

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

示例 3:

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

 

提示:

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

 解题思路:

 图片来源【灵茶山艾府

代码

class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        // 对象在栈上分配内存,不需要手动释放内存
        // 指针在堆上分配内存,需要手动释放内存,避免内存泄漏
        ListNode dummy(0,head); //初始化列表的形式创建对象,作为哨兵节点
        auto node0=&dummy;
        auto node1=head;

        // 至少有两个节点
        while(node1 && node1->next){
            auto node2=node1->next;
            auto node3=node2->next;

            node0->next=node2;//0->2
            node2->next=node1;//2->1
            node1->next=node3;//3->1

            // 下一轮交换,
            node0=node1; //0是1
            node1=node3; //1是3
        }
        
        return dummy.next;
    }
};
思路总结:
  1. 引入哨兵节点:dummy对象作为哨兵节点,简化对链表头结点的处理逻辑
  2. 交换与遍历:使用多个指针遍历链表,在每次循环中找到待交换的两个结点及其后续结点,进行节点交换,然后更新指针,准备下一轮的交换
  3. 返回结果:循环结束,dummy.next作为新链表的头结点

标签:pairs,交换,head,next,链表,swap,node1,节点
From: https://www.cnblogs.com/Makerr/p/18442924

相关文章

  • P4778 Counting Swaps
    题意:给定一个\(1\simn\)的排列\(a\)。每次可以选两个位置\(i,j\),耗费\(1\)的代价交换\(a_i,a_j\)。问使得\(a\)升序排列的最小代价是多少,以及方案数。\(1\len\le10^5\)。求最小代价:连边\(i\rightarrowa_i\),得到若干个环。一个大小为\(x\)的环需要\(x-1\)次操作......
  • linux内核双向链表使用list klist
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、list和klist是什么?二、代码示例1.list2.klist总结前言提示:这里可以添加本文要记录的大概内容:linux内核中大量使用了链表数据结构来存储各种数据,比如device和driver使用klist存储,下......
  • 【LeetCode Hot 100】23. 合并K个升序链表
    题目描述看到这个题目会想起之前做过的合并2个升序链表。在那个题目中,由于两个链表都已经是升序的,可以将两个链表的元素进行逐个比较并添加到答案链表中。但是在本题中,每次循环都需要在k个链表的当前元素中找出最小的,而且需要在所有k个链表都遍历完之后跳出循环,所以效率比较低。......
  • 数据结构~~链表
    目录一、链表的概念二、单链表1.单链表的结构2.单链表的接口实现 2.1、动态申请节点2.2、单链表打印 2.3、摧毁单链表 2.4、单链表尾插 2.5、单链表的头插 2.6、单链表的尾删 2.7、单链表的头删 2.8、单链表在pos位置之前插入x2.9、单链表删除pos位置的值......
  • 信息学奥赛复赛复习07-CSP-J2020-03表达式前置知识点-结构体、链表、链式前向星
    PDF文档公众号回复关键字:2024093012020CSP-J题目1优秀的拆分[题目描述]链式前向星模板题,读入n个点,m条边,以及flag,若flag==1则图有向,否则无向。对每个点输出它的每一条边[输入格式]第一行三个数n,m,flag,题意如上所示第2~1+m行,每行三个数,x,y,z,代表从x到y有一条长为z的......
  • 【hot100-java】【合并两个有序链表】
    记忆中,两个指针合并即可。 建立哨兵节点dum/***Definitionforsingly-linkedlist.*publicclassListNode{*intval;*ListNodenext;*ListNode(){}*ListNode(intval){this.val=val;}*ListNode(intval,ListNodenext......
  • 【数据结构】链表(2)
     【LinkedList的模拟实现】这是java中的一个集合类,可以当成链表来使用,作为链表时,它视为包含三个域,是一个双向链表【构建LinkedList框架】publicclassMyLinkedList{staticclassListNode{publicintval;publicListNodeprev;//前驱......
  • 203_移除链表元素
    203_移除链表元素【问题描述】给你一个链表的头节点head和一个整数val,请你删除链表中所有满足Node.val==val的节点,并返回新的头节点。示例一:输入:head=[1,2,6,3,4,5,6],val=6输出:[1,2,3,4,5]示例二:输入:head=[],val=1输出:[]示例三:输入:head=[7,7,7......
  • c语言实现:链表创建、插入、删除、翻转
    #include<stdio.h>#include<stdlib.h>//链表创建typedefstructNode{intdata;structNode*next;}Node;//创建一个节点Node*createNode(intdata){Node*newNode=(Node*)malloc(sizeof(Node));newNode->data=data;newNode......
  • 代码随想录算法训练营第四天|24. 两两交换链表中的节点,19.删除链表的倒数第N个节点,面
    24.两两交换链表中的节点文章链接:https://programmercarl.com/0024.两两交换链表中的节点.html#思路视频讲解:https://www.bilibili.com/video/BV1YT411g7br代码链接:https://leetcode.cn/problems/swap-nodes-in-pairs/此题注意点:注意由于交换节点,head已经变换了位置,故最终......