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

【leetcode hot 100 24】两两交换链表中的节点

解法一:先判断链表是否为空,若为空则直接返回;否则用leftright指向第一个和第二个节点,当这两个节点非空时一直执行交换。其中先判断right.next==null,说明链表为偶数且已经交换完break;再判断right.next.next==null,说明链表为奇数且已经交换完break;否则重新设置leftright继续循环。

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode swapPairs(ListNode head) {if (head == null){return head;}ListNode left=head, right=head.next;while(left!=null && right!=null){int temp = left.val;left.val = right.val;right.val = temp;if(right.next==null){break;}if(right.next.next==null){break;}left = right.next;right = left.next;}return head;}
}

注意:

  • 先判断链表是否为空,若为空则直接返回
  • left!=null && right!=null,则一直交换
  • 先判断right.next==null,说明链表为偶数且已经交换完break;再判断right.next.next==null,说明链表为奇数且已经交换完break;否则重新设置leftright继续循环。

错误原因:只进行了节点内部值的交换,不是节点之间的交换。

解法二:递归

递归的终止条件是链表中没有节点,或者链表中只有一个节点,此时无法进行交换。

如果链表中至少有两个节点,则在两两交换链表中的节点之后,原始链表的头节点变成新的链表的第二个节点,原始链表的第二个节点变成新的链表的头节点。链表中的其余节点的两两交换可以递归地实现。在对链表中的其余节点递归地两两交换之后,更新节点之间的指针关系,即可完成整个链表的两两交换。

class Solution {public ListNode swapPairs(ListNode head) {if (head == null || head.next == null) {return head;}ListNode newHead = head.next;head.next = swapPairs(newHead.next);newHead.next = head;return newHead;}
}

注意:

  • 中止条件:head == null || head.next == null

http://www.mrgr.cn/news/94132.html

相关文章:

  • Visual C++ 6.0(完整绿色版)安装设置
  • pytorch retain_grad vs requires_grad
  • 项目实操分享:一个基于 Flask 的音乐生成系统,能够根据用户指定的参数自动生成 MIDI 音乐并转换为音频文件
  • git本地仓库链接远程仓库
  • go 标准库包学习笔记
  • Rust 之一 基本环境搭建、各组件工具的文档、源码、配置
  • Burpsuite使用笔记
  • 【大模型统一集成项目】让 AI 聊天更丝滑:SSE 实现流式对话!
  • 【大模型统一集成项目】让 AI 聊天更丝滑:WebSocket 实现流式对话!
  • Android实现Socket通信
  • 利用selenium调用豆包进行自动化问答以及信息提取
  • tcc编译器教程6 进一步学习编译gmake源代码
  • go函数详解
  • 【Linux】线程池、单例模式、死锁
  • JVM内存结构笔记01-运行时数据区域
  • golang 高性能的 MySQL 数据导出
  • 下载以后各个软件或者服务器的启动与关闭
  • Docker安装RabbitMQ
  • Qt入门笔记
  • macOS 安装配置 iTerm2 记录