我必须编写代码来解决此问题:
-在两个节点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){
//.......
}
}
答案 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
语句,因为每种情况下都有回报。
希望有帮助!