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

目录

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

两两交换链表中的节点

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

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

  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.hqwc.cn/news/154738.html

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

相关文章

AD 过滤器

应用场景&#xff1a; 只想选择某一层的内容只选择布线只选择焊盘… 因此&#xff0c;有时候AD选中不了对象&#xff0c;也有可能是过滤器打开过滤掉了。

C语言KR圣经笔记 2.11条件表达式 2.12优先级和求值顺序

2.11条件表达式 if (a > b) z a; else z b; 上面的语句计算 a 和 b 中的最大值并存入 z。而使用三元操作符 ? : 的条件表达式&#xff0c;为这个结构及类似结构提供了另一种写法。在如下表达式 expr1 ? expr2 : expr3 中&#xff0c;首先对 expr1 求值。如果值非0 …

使用示例和应用程序全面了解高效数据管理的Golang MySQL数据库

Golang&#xff0c;也被称为Go&#xff0c;已经成为构建强大高性能应用程序的首选语言。在处理MySQL数据库时&#xff0c;Golang提供了一系列强大的库&#xff0c;简化了数据库交互并提高了效率。在本文中&#xff0c;我们将深入探讨一些最流行的Golang MySQL数据库库&#xff…

【idea】生成banner.txt

Spring Boot banner在线生成工具&#xff0c;制作下载英文banner.txt&#xff0c;修改替换banner.txt文字实现自定义&#xff0c;个性化启动banner-bootschool.netSpring Boot banner工具实现在线生成banner&#xff0c;轻松修改替换实现自定义banner&#xff0c;让banner.txt文…

学习笔记|配对样本均数T检验|SPSS常用的快捷键|规范表达|《小白爱上SPSS》课程:SPSS第六讲 | 配对样本均数T检验

目录 学习目的软件版本原始文档配对样本均数T检验一、实战案例二、案例解析三、统计策略四、SPSS操作1、正态性检验2、配对样本T检验 五、结果解读六、规范报告1、规范表格2、规范文字 划重点Tips:SPSS常用的快捷键 学习目的 SPSS第六讲 | 配对样本均数T检验 软件版本 IBM S…

3 tensorflow构建模型详解

上一篇&#xff1a;2 用TensorFlow构建一个简单的神经网络-CSDN博客 1、神经网络概念 接上一篇&#xff0c;用tensorflow写了一个猜测西瓜价格的简单模型&#xff0c;理解代码前先了解下什么是神经网络。 下面是百度AI对神经网络的解释&#xff1a; 神经网络是一种运算模型&…

openEuler社区2023年度满意度调研

Hi&#xff0c;朋友们 一年一度的openEuler社区满意度调研来啦&#xff01;我们诚邀您参与问卷调研&#xff0c;反馈您在社区的使用情况。我们会持续吸纳建议&#xff0c;为您创造更好的用户体验&#xff01; 时间&#xff1a;2023年10月27日-2023年12月17日 。 链接&#x…

【Linux】第三站:Linux基本指令(二)

文章目录 一、通配符 *二、man指令三、cp指令1.先给一个文件里面写入数据2. cp指令拷贝普通文件3.cp指令拷贝文件目录4.常用的选项总结 四、mv指令1.mv命令简介2.使用 五、一些插曲1.一些注意事项2.指令的本质3.再谈输出重定向4.追加重定向5.输入重定向 六、cat指令七、more指令…

电脑录像功能在哪?一文帮你轻松破解

“电脑录像功能在哪里呀&#xff1f;最近因工作上的原因&#xff0c;需要使用电脑来录像&#xff0c;但是找了一上午都找不到在哪里&#xff0c;眼看已经快没时间了&#xff0c;现在真的很急&#xff0c;希望大家帮帮我。” 电脑已经成为了人们生活和工作中必不可少的工具&…

【ROS教程demo】用C++创建一个ROS节点,发布指令使得小海龟做圆周运动

ROS创建节点发布命令使得小海龟做圆周运动 1.任务需求2.任务分析2.1发布方topic和msg2.2接收方topic和msg2.3目标明确!3.创建ROS节点3.1创建发布方节点pub_pose3.2创建订阅方节点sub_pose1.任务需求 创建一个节点,在其中实现一个订阅者和一个发布者,完成以下功能: 发布者:…

Mac电脑配置Dart编程环境

1.安装Dart SDK 官网地址&#xff1a;https://dart.dev/get-dart $brew tap dart-lang/dart$brew install dart 安装后&#xff0c;用命令检测一下是否安装正常。 $brew info dart 2.VS Code配置Dart环境 1).安装VS Code 官网地址&#xff1a;https://code.visualstudio.c…

APP推荐:推荐一款免费无广告的本地音乐播放器,手机听歌必备

目录 一、软件简介 二、软件特色 三、软件使用 四、软件下载 相信很多朋友都喜欢听歌&#xff0c;今天给大家推荐一款非常棒的手机本地音乐APP——糖醋音乐&#xff0c;完全无广告、免费听歌&#xff0c;大家只需要把自己需要的歌曲下载到你的手机就可以愉快的听歌了&#…