菜鸟的算法入门:java的链表操作

菜鸟的算法入门:java的链表操作

从C语言的指针开始,我的算法之路就结束了!

今天为了找个好的实习,不得不捡起来,写了三年的web,算法落下了太多了

今天在leetcode上刷题,难在了一个简单的链表上,因此记录一下

题目:给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。    你可以假设除了数字 0 之外,这两个数字都不会以零开头。
示例: 输入:(
2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807

解题过程是几经波折的,最开始弄出来的答案还是头插式的,并且还超时了,真菜

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        int flag=0;//用于判断是否进位  1为进位,0为不进,可以直接做数值存储
     int sum=0; //用于存放当前位相加的和 int i1=0;  //l1的val int i2=0;  //l2的val ListNode head=new ListNode(0); //声明一个节点为头节点,因为是尾插,最终的node为最后一个节点的节点值 ListNode node=head;  //声明一个临时变量,用于尾插的操作 while(l1!=null||l2!=null){
       //如果当前节点为空,则赋值为0,方便继续运算
il = (l1 !=null) ? l1.val : 0;if(l2!=null){ i2=l2.val; }else{ i2=0; } sum=i1+i2+flag; //得到当前运算的和 flag=sum/10;  //是否进位

       //对当前节点尾插一个节点,存储当前节点的值 第一次运算时,相当于head.next=new ListNode(7) 这也是为什么最后返回head.next的原因 node.next
=new ListNode(sum%10);
       //将当前节点的next赋值给当前节点,即将指针移到链表的尾部 node
=node.next; if (l1 != null) l1 = l1.next; if (l2 != null) l2 = l2.next; }
     //如果最后又进位,再给尾部插入一个新的节点
if (flag > 0) { node.next = new ListNode(flag); } return head.next; } }

在本题中,采用的是尾插法,不停的在链表的尾部插入新的节点

取值时,只需要对最开始的head进行向下取值即可

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

0.开始循环之前

head={
    val : 0
    next : null
}
node={
    val : 0
    next : null
}

1.第一次循环

node.next=new ListNode(sum%10); 运行结果:
node={
    val : 0
    next : {
        val : 7
        next : null
    }
}
由于head=node:
head={
    val : 0
    next : {
        val : 7
        next : null
    }
}
node=node.next; 运行结果:
node={
    val : 7
    next : null;
}

head不变

2.第二次循环

node.next=new ListNode(sum%10); 运行结果:
node={
    val : 7
    next : {
        val : 0
        next : null
    }
}
由于head=node:
head={
    val : 0
    next : {
        val : 7
        next : {
            val : 0
            next : null
        }
    }
}
node=node.next; 运行结果:
node={
    val : 0
    next : null;
}

head不变    

3.第三次循环

node.next=new ListNode(sum%10); 运行结果:
node={
    val : 0
    next : {
        val : 8
        next : null
    }
}
由于head=node:
head={
    val : 0
    next : {
        val : 7
        next : {
            val : 0
            next : {
                val : 8
                next : null
            }
        }
    }
}
node=node.next; 运行结果:
node={
    val : 8
    next : null;
}

head不变          

4.返回结果

head={
    val : 0
    next : {
        val : 7
        next : {
            val : 0
            next : {
                val : 8
                next : null
            }
        }
    }
}

head.next={
    val : 7
    next : {
        val : 0
        next : {
            val : 8
            next : null
        }
    }
} 

5.总结

最开始的head节点是整个运算中不动的,node节点相当于其的一个尾巴,
不断的添加数据到自身,然后后移到添加的节点上去

类似于一个贪吃蛇,head节点一直不变,node节点是一个工作节点(长度为1)
  他的工作是找到一个新的节点,让其附着在自己的next上(node.next=new ListNode)
  然后移到到这个新的节点上去(node=node.next)
  重复这项工作

转载于:https://www.cnblogs.com/fdzang/p/9581687.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/101454.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 反射之动态拼接sql字符串「建议收藏」

    反射之动态拼接sql字符串「建议收藏」反射之动态拼接sql字符串前言自己在学习JDBC连接数据库,不用框架手动实现时,个人觉得反射动态拼接sql的思想很好,当然了大家伙觉得好才是真的好(广州好迪,手动狗头),所以才有了本文对该知识点梳理与总结。分享给大家,下面开始步入文章的正文,亲们不要掉队。正文…

    2025年5月27日
    2
  • 西数移动硬盘不识别(移动硬盘怎么用)

    移动硬盘作为便携式存储器,很多用户都会在自己的电脑上安装。但最近有网友却反馈说自己的win10ltsb系统电脑出现了西数移动硬盘无法识别的情况,该怎么处理呢?下面本文就为大家整理了关于win10ltsb西数移动硬盘无法识别的具体解决措施,一起往下看吧。解决措施如下:1、首先打开计算机,在【此电脑】上鼠标右键,选择【管理】。2、这样,就进入了计算机管理界面。如下图,选择【磁盘管理】选项。3、在磁盘管理界面可以看到上方列出了所有内置磁盘和插入的磁盘,资源管理器中无法读取的磁盘也在..

    2022年4月12日
    444
  • list列表下嵌套多个list_datalist和select的区别

    list列表下嵌套多个list_datalist和select的区别 aspxviewplaincopytoclipboardprint?%@ Page Language=”C#” AutoEventWireup=”true” CodeFile=”DataListNesting.aspx.cs” Inherits=”DataListNesting” %>  >  html xmlns=”http://www.w3.org/1

    2022年10月13日
    3
  • webview禁止长按复制_chrome复制插件

    webview禁止长按复制_chrome复制插件8.长按事件因为webview长按时将会调用系统的复制控件://长按复制粘贴mWebView.setOnLongClickListener(newView.OnLongClickListener(){@OverridepublicbooleanonLongClick(Viewview){

    2022年9月29日
    4
  • 向navicat中导入数据库时出现错误_mysql数据库怎么导出

    向navicat中导入数据库时出现错误_mysql数据库怎么导出在Navicat导出的 或者别的sql文件,在使用Navicat导入时候 出现异常失败报错问题。搜索了很多资料查看,发现是没有解决掉的。最后无意间想起使用 MySql 直接使用命令导入尝试,发现可行的简单粗暴,直接打开你的MySql 登录以后 选择 要导入的数据库use 数据库名称;source 文件的绝对路径;完事 ,坐等~…

    2022年8月19日
    3
  • 方差、协方差、标准差、均方差、均方根值、均方误差、均方根误差对比分析[通俗易懂]

    方差、协方差、标准差、均方差、均方根值、均方误差、均方根误差对比分析[通俗易懂]方差、协方差、标准差(标准偏差/均方差)、均方误差、均方根误差(标准误差)、均方根值本文由博主经过查阅网上资料整理总结后编写,如存在错误或不恰当之处请留言以便更正,内容仅供大家参考学习。 方差(Variance) 方差用于衡量随机变量或一组数据的离散程度,方差在在统计描述和概率分布中有不同的定义和计算公式。①概率论中方差用来度量随机变量和其数学期望(即均值)之间的偏…

    2022年9月30日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号