zoukankan      html  css  js  c++  java
  • Java-笔算加法

    给定两个用链表表示的正整数,每个结点包含一个数位。编写代码对这两个链表表示的整数求和。要求编写一个函数,接受两个链表作为输入。返回值是一个表示两数和的链表。

    在这些链表中,数位是反向存放的,也就是个位排在链表首部。

    例如:正整数 698 表示为 8 -> 9 -> 6,875表示为 5 -> 7 -> 8,那么输入链表 8 -> 9 -> 6 和 5 -> 7 -> 8,应该返回链表 3 -> 7 -> 5 -> 1(即表示 1573 的链表)。

    提示:如果您不记得链表怎么表达的,下面的图是 "8 -> 9 -> 6" 这个链表的示例:

    链表有结点构成,最简单的链表结点里面包含两个字段:一个表示值的字段、另一个链接下一个结点的指针或引用。Head 表示一个指向头结点的指针。最后一个结点(尾结点)的下一个结点是空指针(空结点),表示链表没有下一个结点了。

    请先定义链表的数据结构,然后编写代码完成上述“求和”的操作。这实际上模拟的是笔算加法的操作,注意进位。

      1 public class ExaminationTest {
      2     public static void main(String[] args) {
      3         test();  
      4     }
      5 
      6     public static void test(){
      7         NumberNode x11 = new NumberNode(3, null);
      8         NumberNode x12 = new NumberNode(6, x11);
      9         NumberNode headX = new NumberNode(4, x12);
     10 
     11         NumberNode y11 = new NumberNode(7, null);
     12         NumberNode y12 = new NumberNode(8, y11);
     13         NumberNode headY = new NumberNode(9, y12);
     14 //        NumberNode calculationLinkedX = calculationLinked(headX, headY);
     15 //        print(calculationLinkedX);
     16 
     17         // 以下为:结果反转为整数形式
     18 //        int reversal = reversal(calculationLinkedX);
     19 //        System.out.println("结果:" + reversal);
     20 
     21 
     22         // 另外一组测试数据
     23         NumberNode a25 = new NumberNode(6, null);
     24         NumberNode a24 = new NumberNode(6, a25);
     25         NumberNode d23 = new NumberNode(6, a24);
     26         NumberNode c22 = new NumberNode(9, d23);
     27         NumberNode headA = new NumberNode(8, c22);
     28 
     29         NumberNode a32 = new NumberNode(8, null);
     30         NumberNode a22 = new NumberNode(7, a32);
     31         NumberNode a11 = new NumberNode(5, a22);
     32         NumberNode headB = new NumberNode(1, a11);
     33         // 另外一组测试数据
     34         NumberNode calculationLinkeA = calculationLinked(headA, headB);
     35         print(calculationLinkeA);
     36 
     37         // 以下为:结果反转为整数形式
     38         int reversal = reversal(calculationLinkeA);
     39         System.out.println("正整数:" + reversal);
     40 
     41     }
     42 
     43     private static NumberNode calculationLinked(NumberNode a, NumberNode b){
     44         NumberNode result = new NumberNode(0, null);
     45         if(a == null && b == null){
     46             return result;
     47         }
     48         if(b == null){
     49             return a;
     50         }
     51         if(a == null){
     52             return b;
     53         }
     54         return plus(a, b, result);
     55     }
     56 
     57     private static NumberNode plus(NumberNode a, NumberNode b, NumberNode result){
     58         NumberNode tail = result;
     59         while (tail.next != null){
     60             tail = tail.next;
     61         }
     62 
     63         NumberNode next = new NumberNode(0, null);;
     64         int headValue = a.value + b.value;
     65         int nextV = 0;
     66         int currentV = headValue;
     67         if(headValue >= 10){
     68             currentV = headValue - 10;
     69             nextV = 1;
     70             next = new NumberNode(nextV, null);
     71         }
     72         tail.value += currentV;
     73         tail.next = next;
     74 
     75         if(a.next == null && b.next == null){
     76             return result;
     77         }
     78         if(a.next != null && b.next != null){
     79             result = plus(a.next, b.next, result);
     80         }
     81         if(a.next == null){
     82             tail.next = b.next;
     83         }
     84         if(b.next == null){
     85             tail.next = a.next;
     86         }
     87         return result;
     88     }
     89 
     90     private static int reversal(NumberNode numberNode){
     91         if(numberNode == null){
     92             return 0;
     93         }
     94         NumberNode next = numberNode;
     95         String result = numberNode.value+"";
     96         while (next.next != null){
     97             next = next.next;
     98             result = next.value+""+result;
     99         }
    100         return Integer.valueOf(result);
    101     }
    102 
    103     // 正向打印链表
    104     private static void print(NumberNode a){
    105         System.out.print("链表:");
    106         if(a == null){
    107             System.out.print(0);
    108             return;
    109         }
    110         System.out.print(a.value + " -> ");
    111         NumberNode next = a;
    112         while (next.next != null){
    113             System.out.print(next.next.value);
    114             next = next.next;
    115             System.out.print(" -> ");
    116         }
    117         System.out.print("null");
    118         System.out.println();
    119     }
    120 
    121     static class NumberNode{
    122         NumberNode next;
    123         int value;
    124         public NumberNode() {}
    125         public NumberNode(int value, NumberNode next) {
    126             this.next = next;
    127             this.value = value;
    128         }
    129         public boolean isTail(){
    130             if(this.next == null){
    131                 return true;
    132             }
    133             return false;
    134         }
    135     }
    136 }

    运行效果:

    1 链表:9 -> 4 -> 4 -> 5 -> 6 -> null
    2 正整数:65449
  • 相关阅读:
    素数筛代码
    stringsream用法
    MySQL学习(四)——外键
    MySQL学习(三)——Java连接MySQL数据库
    MySQL学习(二)——SQL语句创建删除修改以及中文乱码问题
    MySQL学习(一)——启动和登录MySql遇到的问题及解决
    BootStrap学习(三)——重写首页之导航栏和轮播图
    BootStrap学习(二)——重写首页之topbar
    BootStrap学习(一)——BootStrap入门
    jQuery学习(八)——使用JQ插件validation进行表单校验
  • 原文地址:https://www.cnblogs.com/bridgestone29-08/p/13961740.html
Copyright © 2011-2022 走看看