当前位置: 首页 > news >正文

力扣24.两两交换链表中的节点

文章目录

  • 力扣24.两两交换链表中的节点
    • 题目描述
    • 方法1:非递归
    • 方法2:递归

力扣24.两两交换链表中的节点

题目描述

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

示例 1:

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

输入:head = []
输出:[]
示例 3:

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

提示:

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

方法1:非递归

/*** 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 *p=head,*t,*pre=NULL;if(p->next!=NULL) head=p->next;//直接指定最终的返回位置,即应当是原始第二个节点(不为空)while(p!=NULL){t=p->next->next;//记录后继节点的下一个位置if(pre!=NULL) pre->next=p->next;//将前驱节点接到后续节点上,防止断链pre=p;//将本节点标记为下一次的前驱节点p->next->next=p;//交换相邻节点,即让相邻节点的后继指针指向当前节点p->next=t;//当前节点的后继指针指向原后继节点的后继p=t;//更新当前节点的位置,准备进行下一次交换if(p!=NULL&&p->next==NULL) return head;//如果更新后只剩下单独一个节点了则不用再交换了,立即返回结果}return head;
}

方法2:递归

从第一个节点开始,要通过递归的方式寻找交换之后该节点的下一个节点,规律是:

  • 第1个节点的下一个节点是下一个节点的下一个节点,即第3个节点
  • 第2个节点的下一个节点是第1个节点
  • 以此类推

递归函数中其中一个重大的作用就是为它的上一级调用函数返回需要的节点作为上一级递归中的下一个节点,我们暂存这个节点,在需要结束时返回给上一级函数。

struct ListNode *p=head->next;

同时我们通过调用下一级递归函数的方式来期望获得当前节点交换后连接的下一个节点,注意一次调用的步长为2,即隔一个节点进行下一次调用:

head->next=swapPairs(head->next->next);

并且根据规律,本节点的前驱节点也应改成本节点的原后继节点,即上面暂存的节点P

p->next=head;

最终递归函数完整应写成如下形式:

/*** 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 *p=head->next;//记录当前节点的下一个节点head->next=swapPairs(head->next->next);p->next=head;return p;
}
http://www.lryc.cn/news/7138.html

相关文章:

  • AtCoder Regular Contest 137 题解(A~C)
  • 【C语言】预处理指令
  • Java基础之多线程JUC全面学习笔记
  • 13.CSS文本样式
  • 西恩科技更新招股书:IPO前大手笔分红“套现”, 赵志安为实控人
  • 【CentOS】有关时间的设置
  • OpenCV制作Mask图像掩码
  • C++STL剖析(九)—— unordered_map和unordered_multimap的概念和使用
  • Android无菜单键,如何触发onCreateOptionsMenu(Menu menu)
  • “黑洞”竟是外星人的量子计算机?
  • 计算机网络入门
  • 网络安全-内网DNS劫持-ettercap
  • synchronized和Lock的区别
  • SpringBoot 指标监控 Actuator
  • 面试浅谈之十大排序算法
  • LeetCode-1250. 检查「好数组」【数论,裴蜀定理】
  • 【Linux】NTP时间同步服务与NFS网络文件共享存储服务器(配置、测试)
  • windows下php连接oracle安装oci8扩展报错(PHP Startup: Unable to load dynamic library ‘oci8_11g‘)
  • TensorRT的功能
  • 433MHz无线通信--模块RXB90
  • Seata源码学习(三)-2PC核心源码解读
  • IO流概述
  • 【node.js】node.js的安装和配置
  • Python优化算法—遗传算法
  • 数据埋点(Data buried point)的应用价值剖析
  • 一文弄懂硬链接、软链接、复制的区别
  • 界面组件Telerik ThemeBuilder R1 2023开创应用主题研发新方式!
  • 在FederatedScope 如何查看clientserver之间的传递的参数大小(通讯量)? 对源码的探索记录
  • 2023爱分析 · 数据科学与机器学习平台厂商全景报告 | 爱分析报告
  • 20230215_数据库过程_高质量发展