两个节点之间的减法

时间:2019-06-23 16:10:10

标签: java list oop

我必须编写代码来解决此问题:

-在两个节点p和q之间进行减法,其中减法p-q是包含所有出现在p而不是q中的元素的列表,知道p和q是有序列表。

我试图编写代码,但我知道它不起作用...您能帮我解决这个问题吗?非常感谢你!

 class Node{
    public int elem;
    public Node next;

    public Node(int elem, Node next){
        this.elem = elem;
        this.next = next;
    }

}

 public class Main{
     public static Node diff(Node p, Node q){
            if( p.elem == q.elem )
                return diff(p.next, q.next);
            else if(p.elem < q.elem){
                return new Node (p.elem, diff(p.next, q.next));
            else
                return new Node(p.elem, diff(p.next, q.next));
        }
 public static void main(String[] args){
 //.......
 }
 }

1 个答案:

答案 0 :(得分:0)

您的递归永远不会结束,因为递归方法中的每个return语句都会调用自身,这会将您的代码引向堆栈溢出。

要解决此问题,应分解问题。

首先,让我们找到基本情况。 在这些情况下,递归结束,而您遇到的问题有两种:

  • 如果p == null,即,如果链表中不再包含任何项目,则说明工作已完成,没有什么可添加到结果链表中了。
if(p == null)
{
    return null;
}
  • 如果为q == null,则应将所有剩余项添加到链接列表中,即p节点本身。
if(q == null) 
{
    return p;
}

还有3种可能发生递归的情况:

  • 如果为p.elem == q.elem,则不应添加该节点,而对于每个链接列表,我们应该转到下一个节点。由于列表是有序的,因此该节点以后无法使用。
if(p.elem == q.elem)
{
    return diff(p.next, q.next);
}
  • 如果p.elem > q.elem,该节点可能有用,但我们尚不知道。第二个链表的下一个节点可能相等,因此我们仅跳到第二个链表的下一个节点。
if (p.elem > q.elem) 
{
    return diff(p, q.next);
}
  • 仅剩一种情况,如果p.elem < q.elem。就是这样,我们确定第二个链接列表中不存在该节点,因此我们向结果添加了一个新节点。
return new Node(p.elem, diff(p.next, q);

请注意,在每种情况下都不需要else语句,因为每种情况下都有回报。

希望有帮助!