菜鸟的算法入门: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

时间: 2024-10-04 12:45:43

菜鸟的算法入门:java的链表操作的相关文章

Java单向链表操作详解

转自:http://blog.csdn.net/zxman660/article/details/7786354 —————————————————————————————————————————— /* 先定义一个Node类用来存储节点的值域和指针域 * 即当前节点中的值和后面节点的方法 * 在C中就是相当与定义一个结构体类型一个数据域和指针域的方法 */ class LNode{//这个写法已经非常固定了 设置两个属性分别用set函数和get函数来得到这两个属性 private int da

算法刷题-1-单链表操作

1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 //练习单链表操作:给出单链表 head 和 n,要求删除单链表倒数第n个结点,并连接剩余结点 5 //例子:1-2-3-4-5,n=2,删除后应该是:1-2-3-5 6 typedef struct ListNode{ 7 int data; 8 ListNode *next; 9 }ListNode; 10 11 int create

嵌入式菜鸟进阶①---算法入门基础

1.按照数据元素之间存在的逻辑关系可分4中种逻辑关系: "一对一":线性结构 "一对多":树形结构 "多对多":图状或网状结构 "同属一个集合,无其它关系":纯集合结构 2.按在计算机中存储分类: 顺序存储:逻辑相邻且物理位置也相邻 链状存储:逻辑相邻,物理位置无要求 索引存储:存储数据元素的同时,建立索引表,索引表中一般包括关键字和地址等信息(关键字唯一标识一个数据元素) 散列存储:依据数据元素的关键字直接计算出数据元素的存

12.9《 算法入门》 循环 文件操作

循环1.7744 问题 <math.h>中的floor()函数 表示向下取整. Floor(0.5) == 0 , Floor(-1.1) == -2 | floor(x+0.5) 表示对x四舍五入 (变为整数)| 因为 1<= x <2 时 floor(x) == 1 1<=x+0.5<2 即 0.5<= x <1.5 时 floor(x + 0.5) == 1. 由此知 floor(x+0.5)起到的作用是四舍五入 A.整数 不同位数的数字求法.前几位数

Java算法入门-数组&amp;链表&amp;队列

算法就是解决问题的步骤,在一般的项目中可能用不上,但是一旦涉及到高并发,高性能时,就不得不考虑算法的优劣. 设计原则和特性 设计原则:正确性,可读性,健壮性,高效率和低存储 特性:有穷性,确定性,可行性,有输入,有输出. 算法题入门体验 如何判断是一个数是2的整数次幂?常规方法使用循环,但是在学习了二进制的基础知识后,发现可以使用模运算来实现. 1 import java.util.Scanner; 2 3 public class base { 4 5 public static void m

【数据结构与算法】java链表操作

链表操作代码量少但是比较容易出错,是比较适合面试的地方. 代码实现 /** * 源码名称:MyLinkList.java * 日期:2014-09-05 * 程序功能:java链表操作 * 版权:[email protected] * 作者:A2BGeek */ import java.util.Stack; public class MyLinkList { class LinkNode<T> { private T mValue; private LinkNode<T> mNe

【LeetCode-面试算法经典-Java实现】【225-Implement Stack using Queues(用队列实现栈操作)】

[225-Implement Stack using Queues(用队列实现栈操作)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 代码下载[https://github.com/Wang-Jun-Chao] 原题 Implement the following operations of a stack using queues. push(x) – Push element x onto stack. pop() – Removes the element on

【LeetCode-面试算法经典-Java实现】【024-Swap Nodes in Pairs(成对交换单链表的结点)】

[024-Swap Nodes in Pairs(成对交换单链表的结点)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Given a linked list, swap every two adjacent nodes and return its head. For example, Given 1->2->3->4, you should return the list as 2->1->4->3. Your algorithm s

【LeetCode-面试算法经典-Java实现】【025-Reverse Nodes in k-Group(单链表中k个结点一组进行反转)】

[025-Reverse Nodes in k-Group(单链表中k个结点一组进行反转)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. If the number of nodes is not a multiple of k then left-out nodes i