【问题标题】:Object Oriented Concepts Clarification [closed]面向对象的概念澄清
【发布时间】:2014-01-03 23:53:17
【问题描述】:

我对我的 OO 概念有一些基本的怀疑。我正在努力解决这个问题

你有两个由一个链表表示的数字,其中每个节点 包含一个数字。数字以相反的顺序存储, 使得 1 的数字位于列表的头部。写一个函数 它将两个数字相加并将总和作为链表返回。 示例 输入:(3 -> 1 -> 5) + (5 -> 9 -> 2) 输出:8 -> 0 -> 8

我知道它可以递归解决,但我尝试的是迭代测试问题。我写的方法是这样的

public LinkedList sum(LinkedList a){
    int carry = 0;
    Node head1 = a.first;
    Node head2 = this.first;
    LinkedList sum = new LinkedList();
    Node k = sum.first;
    if(a.first != null && this.first != null){
        k.item = (head1.item+head2.item) % 10;
        carry = (head1.item+head2.item) / 10;
    }
    head1 = head1.next;
    head2 = head2.next;

    while(head1 != null){
        k.next = new Node((head1.item + head2.item + carry) % 10);
        carry = (head1.item + head2.item) / 10;
        head1 = head1.next;
        head2 = head2.next;
        k = k.next;
    }
    return sum;
}

我用来调用它的方法是这样的

    LinkedList object1 = new LinkedList();
    LinkedList object2 = new LinkedList();
    object1.insert(5);
    object1.insert(1);
    object1.insert(3);
    object2.insert(2);
    object2.insert(9);
    object2.insert(5);
    LinkedList object3 = object1.sum(object2);
    object3.display();

我在该行中得到一个空指针异常

k.item=(head1.item+head2.item)%10;

如何修改 sum 方法以显示正确的结果。请不要建议递归方式,因为我已经知道了。这个问题的重点是我想澄清我的面向对象的概念。

更多信息 Node 类看起来像这样

class Node {
    public int item;
    public Node next;
    public Node(int val){
        item = val;
    }

    public Node(){}

    public void displayNode() {
        System.out.println("[" + item + "] ");
    }
}

LinkedList 类有一个全局声明

私有节点优先;

【问题讨论】:

  • 如果您在该行中得到一个空指针,那么此时 head1、head2 或 k 为空。找出原因。在调试器下运行,或放入一些打印输出,以便您可以跟踪程序的进度。
  • 这里没有面向对象的概念。
  • 我相信 k 为空。因为当我初始化 LinkedList 对象 sum 时,它的值默认初始化为 null。所以当我尝试 k=sum.first 时。我相信 k 变为空值。如何更改?

标签: java oop object linked-list object-oriented-analysis


【解决方案1】:

初始化 LinkedList 会生成一个空的 LinkedList 对象,然后您必须使用节点填充该对象。您的 sum LinkedList 没有节点,因此您不能将节点 k 分配给 sum.first。

要解决这个问题,您需要使用 Node k = new Node(); 但是,最好在您的 LinkedList 实现中使用/创建一个 add() 方法来为您处理这个问题,以及一个 remove() 方法。这样您就不需要同时在总和 LinkedList 中创建和跟踪节点。

除此之外,您应该小心检查 head1 和 head2 在求和之前都不等于 null,否则您将被限制为相同数字长度的数字。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-22
    • 1970-01-01
    • 2018-09-13
    • 2014-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多