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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章