菜鸟的算法入门: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)
重复这项工作
菜鸟的算法入门:java的链表操作的更多相关文章
- [算法]用java实现堆操作
问题描述:(1)建堆:将数组A[1..n]变成一个最大堆.(课本6.3)(2)堆排序:将一个堆中的元素按递减排序输出.(3)用插入方法建堆:堆大小从1到n每次插入一个元素到堆中,直到n个元素入堆.(课 ...
- Java实现链表的常见操作算法
链表分为单链表,双向链表和循环链表,是一种链式存储结构,由一个个结点链式构成,结点包含数据域和指针域,其中单链表是只有一个指向后驱结点的指针,双向链表除头结点和尾结点外,每个结点都有一个前驱指针和一个 ...
- 算法 - 链表操作思想 && case
算法 - 链表操作题目套路 前面这一篇文章主要讲链表操作时候的实操解决方式,本文从本质讲解链表操作的元信息,学完后,再也不怕链表操作题目了. 1.链表的基本操作 链表的基本操作无外乎插入,删除,遍历 ...
- JAVA 链表操作:循环链表
主要分析示例: 一.循环链表简述 二.单链表循环链表 三.双链表循环链表 一.循环链表简述 循环链表即链表形成了一个循环的结构,尾节点不再指向NULL,而是指向头节点HEAD,此时判定链表的结束是尾节 ...
- 【LeetCode-面试算法经典-Java实现】【109-Convert Sorted List to Binary Search Tree(排序链表转换成二叉排序树)】
[109-Convert Sorted List to Binary Search Tree(排序链表转换成二叉排序树)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 ...
- 【LeetCode-面试算法经典-Java实现】【114-Flatten Binary Tree to Linked List(二叉树转单链表)】
[114-Flatten Binary Tree to Linked List(二叉树转单链表)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given a bin ...
- Redis入门和Java利用jedis操作redis
Redis入门和Java利用jedis操作redis Redis介绍 Redis 是完全开源的,遵守 BSD 协议,是一个高性能的 key-value 数据库. Redis 与其他 key - val ...
- LeetCode入门指南 之 链表
83. 删除排序链表中的重复元素 存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 .返回同样按升序排列的结果链表. class Soluti ...
- 十大经典排序算法(java实现、配图解,附源码)
前言: 本文章主要是讲解我个人在学习Java开发环境的排序算法时做的一些准备,以及个人的心得体会,汇集成本篇文章,作为自己对排序算法理解的总结与笔记. 内容主要是关于十大经典排序算法的简介.原理.动静 ...
随机推荐
- Ubuntu18.04防火墙相关
Ubuntu 18.04 LTS 系统中已经默认附带了 UFW 工具,如果您的系统中没有安装,可以在「终端」中执行如下命令进行安装: sudo apt install ufw 检查UFW状态 sudo ...
- 深入理解JVM(五) -- 垃圾回收算法
上篇文章我们了解到哪些内存区域和哪些对象可以被回收,这篇文章我们就来了解一下具体的垃圾回收算法的思路,不讨论具体的实现. 一 最基础算法 标记-清除(Mark-Swap) 为什么说他是最基础的算法,因 ...
- kubernetes第六章--如何访问pod
- SQL*Plus 格式化查询结果
为了在 SQL*Plus 环境中生成符合用户需要规范的报表,SQL*Plus 工具提供了多个用于格式化查询结果的命令,使用这些命令可以实现设置列的标题.定义输出值的显示格式和显示宽度.为报表增加头标题 ...
- error: unknown filesystem; grub rescue
我的电脑是win10+ubumtu双系统 在一次windows更新之后,系统无法进入win10和linux系统,出现如图错误 解决方案1: 大部分中文博客的解决方案:这里有个更加详细的: https: ...
- Python学习日记(五) 编码基础
初始编码 ASCII最开始为7位,一共128字符.最后确定8位,一共256个字符,最左边的为拓展位,为以后的开发做准备. ASCII码的最左边的一位为0. 基本换算:8位(bit) = 1字节(byt ...
- Elasticsearch 是什么
Elasticsearch 是什么 Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎.无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进.性能最好的.功 ...
- MySQL Connection--使用tcpkill杀掉MySQL活跃连接
当MySQL连接被打满,连管理员也无法本地登录时,可以考虑使用tcpkill杀掉一些应用服务器创建的连接. CentOS 6安装tcpkill rpm安装包: libnids-1.24-1.el6.x ...
- SQL PLUS 远程连接数据库
-- SQL PLUS 远程连接Oracle数据库(WINDOWS+SQL PLUS)命令:用户名/密码@ip地址[:端口]/service_name [as sysdba] EG: ORCL/ORC ...
- Redis主从同步之主库挂死解决方案
Redis实现了主从同步,但是主库挂死了,如何处理 方案:切换主库的身份 # 连接从库 [root@localhost redis-]# redis-cli -p # 取消从库身份 > slav ...