链表加法与节点交换:数据结构的基础技能

目录

    • 两两交换链表中的节点
    • 单链表加一
    • 链表加法
      • 使用栈实现
      • 使用链表反转实现

两两交换链表中的节点

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

我们依旧使用虚拟头节点来进行交换。
在这里插入图片描述
这张图很是清晰的标明了我们要做的交换步骤:

  1. 首先,创建一个虚拟头节点dummyHead,并将其next指针指向head。然后定义一个临时变量temp,将其初始化为dummyHead。
  2. 使用一个while循环遍历链表,直到遇到链表的末尾(即temp.next或temp.next.next为null)。
  3. 在循环中,首先将temp.next赋值给node1,将temp.next.next赋值给node2。然后将temp的next指针指向node2,将node1的next指针指向node2的next,最后将node2的next指针指向node1,然后把temp指向node1。
  4. 循环结束后,返回dummyHead.next,即交换后的链表的头节点。
 public ListNode swapPairs(ListNode head) {ListNode dummyHead = new ListNode(-1);dummyHead.next = head;ListNode temp = dummyHead;while (temp.next != null && temp.next.next != null) {ListNode node1 = temp.next;ListNode node2 = temp.next.next;temp.next = node2;node1.next = node2.next;node2.next = node1;temp = node1;}return dummyHead.next;}

单链表加一

给定一个用单链表表示的整数,然后把这个整数加一。
在这里插入图片描述

public ListNode plusOne(ListNode head) {Stack<Integer> stack = new Stack<>();while (head != null) {stack.push(head.val);head = head.next;}int carry = 0;int adder = 1;ListNode dummy = new ListNode(0);while (!stack.isEmpty() || carry > 0) {int digit = stack.isEmpty() ? 0 : stack.pop();int sum = digit + carry + adder;carry = sum >= 10 ? 1 : 0;sum = sum >= 10 ? sum - 10 : sum;ListNode node = new ListNode(sum);node.next = dummy.next;dummy.next = node;adder = 0;}return dummy.next;}

我们的实现思路就是先把链表压入栈中,给最低位加一,用carry来记录是否有进位,然后用头插的方式把加一的链表连接起来。

  1. 首先创建一个空的栈(Stack)用于保存链表中的数字,并将链表中的每个节点的值依次入栈。

  2. 创建两个变量carry(进位)和adder(加法器),初始化carry为0, adder为1。

  3. 创建一个虚拟节点dummy,并将其值设置为0。用于存储相加后的链表。

  4. 进入while循环,直到栈为空且没有进位时结束循环。在每次循环中,我们从栈中弹出一个数字digit,并计算和sum = digit + carry + adder。

  5. 判断sum是否大于等于10,如果是,设置carry为1(表示进位),并将sum减去10。否则,carry为0。

  6. 创建一个新的节点node,值为sum,并将node插入到虚拟节点dummy之后。

  7. 继续进行下一次循环之前,将adder设为0,以确保下次循环只进行加法操作。

  8. 返回虚拟节点dummy的下一个节点,即加法操作完成后的链表头节点。

链表加法

给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。

你可以假设除了数字 0 之外,这两个数字都不会以零开头。

在这里插入图片描述
我们用两种方式来实现:

使用栈实现

public ListNode addTwoNumbers(ListNode l1, ListNode l2) {Stack<ListNode> stack1 = new Stack<>();Stack<ListNode> stack2 = new Stack<>();while (l1 != null) {stack1.push(l1);l1 = l1.next;}while (l2 != null) {stack2.push(l2);l2 = l2.next;}ListNode dummy = new ListNode(-1);int carry = 0;while (!stack1.isEmpty() || !stack2.isEmpty() || carry != 0) {ListNode a = new ListNode(0);ListNode b = new ListNode(0);if (!stack1.isEmpty()) {a.val = stack1.pop().val;}if (!stack2.isEmpty()) {b.val = stack2.pop().val;}int sum = carry + a.val + b.val;int ans = sum % 10;carry = sum / 10;ListNode cur = new ListNode(ans);cur.next = dummy.next;dummy.next = cur;}return dummy.next;}

以上代码实现了两个链表的加法操作。

  1. 首先创建两个栈stack1和stack2,分别用于存储链表l1和l2中的节点。

  2. 使用while循环,将链表l1和l2的节点依次入栈到stack1和stack2中。

  3. 创建一个虚拟节点dummy,并将其值设为-1,用于存储相加后的链表。

  4. 创建一个变量carry用于表示进位,初始值为0。

  5. 进入while循环,条件为stack1或stack2不为空,或者carry不为0。在每次循环中,我们从stack1和stack2中弹出当前节点的值。

  6. 创建两个新的节点a和b,并将它们的值设为stack1和stack2弹出的节点值。

  7. 计算和sum = carry + a.val + b.val,以及当前节点的值ans = sum % 10。

  8. 更新进位carry = sum / 10。

  9. 创建一个新的节点cur,将其值设为ans,并将cur插入到虚拟节点dummy之后。

  10. 继续进行下一次循环,直到stack1、stack2为空且carry为0。

  11. 返回虚拟节点dummy的下一个节点,即加法操作完成后的链表头节点。

使用链表反转实现

先将两个链表反转,然后计算结果之后,将结果进行反转。

 public ListNode addTwoNumbers(ListNode l1, ListNode l2) {l1 = reverse(l1);l2 = reverse(l2);ListNode head = new ListNode(-1);ListNode cur = head;int carry = 0;while (l1 != null || l2 != null) {int val = carry;if (l1 != null) {val += l1.val;l1 = l1.next;}if (l2 != null) {val += l2.val;l2 = l2.next;}cur.next = new ListNode(val % 10);carry = val / 10;cur = cur.next;}if (carry > 0) {cur.next = new ListNode(carry);}return reverse(head.next);}public ListNode reverse(ListNode head) {ListNode cur = head;ListNode pre = null;while (cur != null) {ListNode next = cur.next;cur.next = pre;pre = cur;cur = next;}return pre;}

具体来说:

  1. 首先,将两个输入的链表l1和l2分别进行倒序处理,即反转链表。

  2. 创建一个新的虚拟头节点head,并创建一个指针cur来表示当前节点,初始时指向head

  3. 创建一个变量carry来表示进位,初始值为0。

  4. 进入循环,直到l1和l2都为空为止。在每次循环中,计算当前位的值val,并将carry加上对应位的值。

  5. 如果l1不为空,将l1的值加到val上,并将l1指向下一个节点。

  6. 如果l2不为空,将l2的值加到val上,并将l2指向下一个节点。

  7. 创建一个新的节点newNode,其值为val % 10,并将其插入到新链表中的下一个位置。

  8. 更新carryval / 10

  9. 更新当前节点cur为新插入的节点。

  10. 继续进行下一次循环。

  11. 如果最后还有进位,创建一个值为进位的新节点,并将其插入到新链表末尾。

  12. 将新链表进行反转,返回反转后的头节点。

这样,两个链表的倒序加法操作就完成了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/173822.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ModbusTCP 转 Profinet 主站网关控制汇川伺服驱动器配置案例

ModbusTCP Client 通过 ModbusTCP 控制 Profinet 接口设备&#xff0c;Profinet 接口设备接入 DCS/工控机等 兴达易控ModbusTCP转Profinet主站网关&#xff08;XD-ETHPNM20&#xff09;采用数据映射方式进行工作。 使用设备&#xff1a;兴达易控ModbusTCP 转 Profinet 主站网关…

竞赛 深度学习实现行人重识别 - python opencv yolo Reid

文章目录 0 前言1 课题背景2 效果展示3 行人检测4 行人重识别5 其他工具6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习的行人重识别算法研究与实现 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c…

几个常用的nosql数据库的操作方式

dynamoDB 键 partition key&#xff1a;分区键 定义&#xff1a;分区键是用于分布数据存储的主键&#xff0c;每个项&#xff08;Item&#xff09;在表中都必须有一个唯一的分区键值。 特点&#xff1a; 唯一性&#xff1a;每个分区键值在表中必须是唯一的&#xff0c;这是因为…

闭包通俗解释,Demo(Go Java Python)

闭包的概念 想象一下&#xff0c;你有一个包裹着变量的函数&#xff0c;就像是一个封闭的包裹。这个包裹里有一个变量&#xff0c;而这个函数&#xff08;或包裹&#xff09;本身就是一个完整的单元。当你把这个函数传递给其他地方&#xff0c;就像是把这个包裹传递出去。 这…

Webpack简介及打包演示

Webpack 是一个静态模块打包工具&#xff0c;从入口构建依赖图&#xff0c;打包有关的模块&#xff0c;最后用于展示你的内容 静态模块&#xff1a;编写代码过程中的&#xff0c;html&#xff0c;css&#xff0c; js&#xff0c;图片等固定内容的文件 打包过程&#xff0c;注…

【黑马程序员】mysql进阶再进阶篇笔记

64. 进阶-锁-介绍(Av765670802,P121) 为了应对不同场景 全局锁-所有表 表计锁 一张表 行级锁 一行数据 65. 进阶-锁-全局锁-介绍(Av765670802,P122) 66. 进阶-锁-全局锁-一致性数据备份(Av765670802,P123) 67. 进阶-锁-表级锁-表锁(Av765670802,P124) 读锁、写锁 68. 进阶…

Ansible脚本进阶---playbook

目录 一、playbooks的组成 二、案例 2.1 在webservers主机组中执行一系列任务&#xff0c;包括禁用SELinux、停止防火墙服务、安装httpd软件包、复制配置文件和启动httpd服务。 2.2 在名为dbservers的主机组中创建一个用户组&#xff08;mysql&#xff09;和一个用户&#xf…

Jtti:Apache服务的反向代理及负载均衡怎么配置

配置Apache服务的反向代理和负载均衡可以帮助您分散负载并提高应用程序的可用性和性能。下面是一些通用的步骤&#xff0c;以配置Apache反向代理和负载均衡。 1. 安装和配置Apache&#xff1a; 确保您已经安装了Apache HTTP服务器。通常&#xff0c;Apache的配置文件位于/etc…

Python文件——使用Python读取txt文件

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 本文专栏&#xff1a;Python专栏 专栏介绍&#xff1a;本专栏为免费专栏&#xff0c;并且会持续更新python基础知识&#xff0c;欢迎各位订阅关注. 目录 一、文件的编码 1. 什么是编码 2. 常见的编码 二、P…

深入浅出排序算法之堆排序

目录 1. 算法介绍 2. 执行流程⭐⭐⭐⭐⭐✔ 3. 代码实现 4. 性能分析 1. 算法介绍 堆是一种数据结构&#xff0c;可以把堆看成一棵完全二叉树&#xff0c;这棵完全二叉树满足&#xff1a;任何一个非叶结点的值都不大于(或不小于)其左右孩子结点的值。若父亲大孩子小&#x…

《动手学深度学习 Pytorch版》 10.7 Transformer

自注意力同时具有并行计算和最短的最大路径长度这两个优势。Transformer 模型完全基于注意力机制&#xff0c;没有任何卷积层或循环神经网络层。尽管 Transformer 最初是应用于在文本数据上的序列到序列学习&#xff0c;但现在已经推广到各种现代的深度学习中&#xff0c;例如语…

提高抖音小店用户黏性和商品销量的有效策略

抖音小店是抖音平台上的电商模式&#xff0c;用户可以在抖音上购买各类商品。要提高用户黏性和商品销量&#xff0c;四川不若与众帮你整理了需要注意以下几个方面。 首先&#xff0c;提供优质的商品和服务。在抖音小店中&#xff0c;用户会通过观看商品展示视频和用户评价来选…

Linux 网络驱动实验(PHY芯片LAN8720)

目录 嵌入式网络简介嵌入式下的网络硬件接口 网络驱动是linux 里面驱动三巨头之一&#xff0c;linux 下的网络功能非常强大&#xff0c;嵌入式linux 中也常 常用到网络功能。前面我们已经讲过了字符设备驱动和块设备驱动&#xff0c;本章我们就来学习一下 linux 里面的网络设备…

GAMP源码阅读(中)伪距单点定位 SPP

原始 Markdown文档、Visio流程图、XMind思维导图见&#xff1a;https://github.com/LiZhengXiao99/Navigation-Learning 文章目录 一、SPP 解算1、spp()&#xff1a;单点定位主入口函数2、estpos()3、estpose_()4、valsol()&#xff1a;GDOP和卡方检验结果有效性 二、卫星位置钟…

N-130基于springboot,vue校园社团管理系统

开发工具&#xff1a;IDEA 服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8 项目构建&#xff1a;maven 数据库&#xff1a;mysql5.7 系统分前后台&#xff0c;项目采用前后端分离 前端技术&#xff1a;vueelementUI 服务端技术&#xff1a;springbootmybatis-plus 本系…

Redis -- 基础知识3 数据类型及指令

FLUSHALL:清空所有键值对操作(最好别搞,删库要被绳之以法的) 1.string类型 1.介绍 1.redis的字符串,直接按照二进制进行存储,所以可以存储任何数据,取出时不需要转码 2.redis的string类型,限制大小最大为512M,因为为单线程模型为了操作短平快 2.操作 1.set与get set key value …

STM32G030F6P6 芯片实验 (一)

STM32G030F6P6 芯片实验 (一) 淘宝搞了几片, 没试过 G系列, 试试感觉. 先搞片小系统版: 套 STM32F103C8T6小系统板格式. 原理图: (1) Ref 有点跳, 从 STM32F103C8T6 系统板改的, 没重编号. (2) Type-C 纯给电, 砍了 16pin的, 直接换 6pin的。 (3) 测试LED放 B2。 (4) 测试底…

uni-app中tab选项卡的实现效果 @click=“clickTab(‘sell‘)“事件可传参数

一、效果图 二、代码 <template><view><view class"choose-tab"><view class"choose-tab-item" :class"chooseTab 0 ? active : " data-choose"0" click"clickTab">选项1</view><view …

webpack 解决:TypeError: merge is not a function 的问题

1、问题描述&#xff1a; 其一、存在的问题为&#xff1a; TypeError: merge is not a function 中文为&#xff1a; 类型错误&#xff1a;merge 不是函数 其二、问题描述为&#xff1a; 想执行 npm run dev 命令&#xff0c;运行起项目时&#xff0c;控制台报错 TypeErro…

【深度学习】Transformer、GPT、BERT、Seq2Seq什么区别?

请看vcr&#xff1a;https://transformers.run/back/transformer/