首页 > 其他分享 >力扣题目两两交换链表中的节点

力扣题目两两交换链表中的节点

时间:2023-05-13 20:32:27浏览次数:30  
标签:tmp 力扣 next 链表 node1 节点 指针

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

示例 1:

力扣题目两两交换链表中的节点_空间复杂度

解题思路

对于这道题我们可以为原链表增加一个哨兵卫,然后创建三个指针,最前面的指针用于判断是否还存在需要交换的节点,后面的两个节点用于交换两个节点。

图解:

力扣题目两两交换链表中的节点_c代码_02

下面创建三个指针,pre,node1,node2。

力扣题目两两交换链表中的节点_空间复杂度_03

第一步:我们运用指针让node1指向的节点的next变为node2指向节点的next(这一步是为了链接好整个链表)

第二步:我们让node2的next指向node1

此时的链表图就变成了:

力扣题目两两交换链表中的节点_c代码_04

下面我们再让pre直接赋值为node1,开始下面两个节点的交换。

既然我们要让原链表的所有元素最后都会两两交换,那肯定是要使用循环的但是循环的条件要怎么去判断呢?我们要使用哪一个指针作为循环的判断条件呢?这里我们就使用pre指针当pre指针的next和pre指针next的next都还存在值而不是NULL那,证明原链表的后面还有至少两个元素这两个元素是可以交换的。

下面是c代码的实现:

struct ListNode* swapPairs(struct ListNode* head)
{
	//方法使用三指针迭代,我们额外将一个哨兵卫将其链接给给予我们的链表
	//然后我们只用改变这个哨兵卫的后两个指针指向即可,最后再将指向哨兵卫的这个指针指向下一个相当于哨兵卫节点功能的节点
	struct ListNode* tmp = (struct ListNode*)malloc(sizeof(struct ListNode));
	tmp->next = head;
	struct ListNode* newhead = tmp;
	while (tmp->next && tmp->next->next)//当tmp的后面两个节点都不为空时表示我已交换下面的两个节点
	{
		struct ListNode* node1 = tmp->next;
		struct ListNode* node2 = node1->next;
		tmp->next = node2;
		node1->next = node2->next;
		node2->next = node1;
		tmp = node1;
	}
	return newhead->next;//这里的newhead指向的我们创建的那个哨兵卫,哨兵卫的next才是指向交换元素后链表的第一个节点
}//最简单的方法时间复杂度o(n)空间复杂度o(1)


标签:tmp,力扣,next,链表,node1,节点,指针
From: https://blog.51cto.com/u_15838996/6273817

相关文章

  • zookeeper总结-动态添加节点
    1.比如现在有zk服务节点node1,node2,node3;之前自己一直以为是直接在node4上配置node1,node2,node3,node4的cluster地址,然后启动node4的zk服务,然后node4的zk服务就能加入到node1,node2,node3这个zk集群里;现在发现不行,node4启动后客户端无法连接上去,它也不会同步node1/node2/node......
  • w9-2 求二叉树中节点间的宽度
    如下图所示的一棵二叉树的深度、宽度及结点间距离分别为:深度:4宽度:4(同一层最多结点个数)结点间距离:⑧→⑥为8(3×2+2=8)⑥→⑦为3(1×2+1=3)注:结点间距离的定义:由结点向根方向(上行方向)时的边数×2,与由根向叶结点方向(下行方向)时的边数之和。输入格式输入文件第一行为一......
  • 双向链表_C语言
    2023年5月12日22:35:371.数据结构普通节点:数据域*data,指针域*prev、*next头结点:size+普通节点其中:头结点data为NULL,size是指定data空间大小,data数据类型未定,也就是说头结点不同于普通节点本文想要实现的额外功能:data数据无论是多大,无论是什么类型,都能直接存放进去代码......
  • 1. LeetCode 35. 力扣第一题
    按照代码随想录的顺序,今天刷了LeetCode35.搜索插入位置,也是刷的力扣第一题classSolution{public:intsearchInsert(vector<int>&nums,inttarget){intleft=0;intright=nums.size()-1;while(left<=right){intm......
  • 2023-05-12:存在一个由 n 个节点组成的无向连通图,图中的节点按从 0 到 n - 1 编号, 给你
    2023-05-12:存在一个由n个节点组成的无向连通图,图中的节点按从0到n-1编号,给你一个数组graph表示这个图,其中,graph[i]是一个列表,由所有与节点i直接相连的节点组成。返回能够访问所有节点的最短路径的长度。你可以在任一节点开始和停止,也可以多次重访节点,并且可以重......
  • 代码随想录算法训练营第三天|203.移除链表元素 、707.设计链表 、206.反转链表
    一.链表基础1.最后一个节点的指针域指向null(空指针的意思)。2.链表在内存中不是连续分布的。3.链表的长度可以是不固定的,并且可以动态增删,适合数据量不固定,频繁增删,较少查询的场景。1#链表节点的定义2classListNode:3def__init__(self,val,next=None):4......
  • 【敲敲云】免费的零代码产品,流程节点 — 获取多条记录实战
    获取多条记录:此节点用于获取工作表中多条数据或多个数组,可以对获取到的多条数据批量编辑,或将获取到的多条数据批量新增到其他工作表中,也支持传递给子流程。获取多条记录节点类型:1.从工作表获取多条2.从单条记录获取关联记录3.从新增节点获取记录1.从工作表获取多条......
  • 四种语言刷算法之排序链表
    力扣148. 排序链表1、C/***Definitionforsingly-linkedlist.*structListNode{*intval;*structListNode*next;*};*/structListNode*sortList(structListNode*head){intn=0;structListNode*newHead=(structListNode*)m......
  • 单节点FC8.2.0 补丁升级
    给单节点FC8.2.0打补丁升级前景提要:登录CNA节点的gandalf用户rpm-qa|grepnetwork-scripts(回显信息)network-scripts-10.04-1.h7.eulerosv2r10#回显的版本号信息中包含“h7”,则可以直接升级#否则,先升级至8.2.0.SPC2补丁版本解压升级工具FusionComputeUpdateTool_......
  • 移除链表元素
     /** * Definition for singly-linked list. * struct ListNode { *     int val; *     ListNode *next; *     ListNode() : val(0), next(nullptr) {} *     ListNode(int x) : val(x), next(nullptr) {} *     ......