Java 比较两个linkedlist

Java 比较两个linkedlist,java,algorithm,data-structures,Java,Algorithm,Data Structures,我是编程新手 我知道有很多比我更好更好的方法来比较两个链表。但是,由于我是新来的,我想修复我的代码,并了解我在哪里犯了错误 我试图做的是循环遍历两个linkedlist,同时比较每个节点 比较两个链表A和B=>如果相同,则返回1;如果不相同,则返回0 我真诚地感谢你的帮助 int CompareLists(Node headA, Node headB) { int i = 0; int j = 0; Node tmpA = headA; Node tmpB

我是编程新手

我知道有很多比我更好更好的方法来比较两个链表。但是,由于我是新来的,我想修复我的代码,并了解我在哪里犯了错误

我试图做的是循环遍历两个linkedlist,同时比较每个节点

比较两个链表A和B=>如果相同,则返回1;如果不相同,则返回0

我真诚地感谢你的帮助

int CompareLists(Node headA, Node headB) {

    int i = 0;
    int j = 0;


    Node tmpA = headA;
    Node tmpB = headB;

    if(tmpB.next != null && tmpA.next == null) return 0;

    while(tmpA.next != null) {

        if(tmpB.next == null) return 0;

        while(tmpB.next != null) {

            if (i == j) {

                if (tmpA.data != tmpB.data) return 0;

            } else {
                break;
            }
            tmpB = tmpB.next;

            j++;



        }   

        i++;

        tmpA = tmpA.next;

    }

    if(tmpA.data != tmpB.data) return 0;
    else return 1;

}

这是您的代码的清理版本。你的总体想法是好的,但你确实增加了一些复杂因素

  • 这两个索引是不必要的,因为您总是保持列表对齐(当B前进时,如果一切正常,则中断,然后A也前进)。这让我想到:
  • 您不需要内部while和break,只需要if来检查当前节点
  • 不过,您确实忘记了一件事—当
    tmpA.next
    为空时,您没有比较A和B的当前数据—因此您需要在循环后进行最后一次检查
  • 这是一个干净的版本:

    int CompareLists(Node headA, Node headB) {    
        Node tmpA = headA;
        Node tmpB = headB;
    
        if(tmpB.next != null && tmpA.next == null) return 0;
    
        while(tmpA.next != null) {    
            if(tmpB.next == null || tmpA.data != tmpB.data) return 0;
    
            tmpB = tmpB.next;
            tmpA = tmpA.next;  
        }
    
        //Added:
        if(tmpB.next != null || tmpA.data != tmpB.data)  return 0;
        return 1;
    }
    
    当然,你不必一直在下一步工作。您可以只测试
    tmpA/tmpB==null
    等,以节省更多空间-我将把它留给您考虑


    正如@vatbub在评论中指出的那样,最后一个挑剔之处是尝试使用最合适的类型-返回布尔值是您在此处实际需要的。

    这里是您的代码的清理版本。你的总体想法是好的,但你确实增加了一些复杂因素

  • 这两个索引是不必要的,因为您总是保持列表对齐(当B前进时,如果一切正常,则中断,然后A也前进)。这让我想到:
  • 您不需要内部while和break,只需要if来检查当前节点
  • 不过,您确实忘记了一件事—当
    tmpA.next
    为空时,您没有比较A和B的当前数据—因此您需要在循环后进行最后一次检查
  • 这是一个干净的版本:

    int CompareLists(Node headA, Node headB) {    
        Node tmpA = headA;
        Node tmpB = headB;
    
        if(tmpB.next != null && tmpA.next == null) return 0;
    
        while(tmpA.next != null) {    
            if(tmpB.next == null || tmpA.data != tmpB.data) return 0;
    
            tmpB = tmpB.next;
            tmpA = tmpA.next;  
        }
    
        //Added:
        if(tmpB.next != null || tmpA.data != tmpB.data)  return 0;
        return 1;
    }
    
    当然,你不必一直在下一步工作。您可以只测试
    tmpA/tmpB==null
    等,以节省更多空间-我将把它留给您考虑


    正如@vatbub在评论中指出的那样,最后一个挑剔之处是尝试使用最合适的类型-返回布尔值是您在这里真正想要的。

    实践会让它变得更好

    int CompareLists(Node a, Node b) {
        while(a!=null && b!=null && a.data == b.data) {
            a=a.next;
            b=b.next;
        }
        return (a==null && b==null ? 1: 0);
    }
    

    它会随着练习变得更好

    int CompareLists(Node a, Node b) {
        while(a!=null && b!=null && a.data == b.data) {
            a=a.next;
            b=b.next;
        }
        return (a==null && b==null ? 1: 0);
    }
    


    您不应该有一个内部while循环->这意味着您正在循环第一个列表中每个节点的第二个列表中的每个节点。相反,您应该依赖于<代码>(tMPB.NET==NULL)已经建立的条件。<代码> > <代码>和<代码> j>代码>不需要。也可以考虑使用<代码>布尔< <代码>作为内存方法的返回类型。efficiency@Welbog事实上,我喜欢你的评论idk如果在这里我可以喜欢一个评论或不。这是一个很好的方法,但仍然不能解决实际问题。但是两个链表都有一个循环是很好的@kabanus我使用
    I
    j
    的唯一原因是我想确保总是在相同的位置比较相同的项目。你认为它是多余的吗?你不应该有一个内部while循环->这意味着你在第二个列表中的每个节点上循环第一个列表中的每个节点。相反,您应该依赖于<代码>(tMPB.NET==NULL)已经建立的条件。<代码> > <代码>和<代码> j>代码>不需要。也可以考虑使用<代码>布尔< <代码>作为内存方法的返回类型。efficiency@Welbog事实上,我喜欢你的评论idk如果在这里我可以喜欢一个评论或不。这是一个很好的方法,但仍然不能解决实际问题。但是两个链表都有一个循环是很好的@kabanus我使用
    I
    j
    的唯一原因是我想确保总是在相同的位置比较相同的项目。你认为这是多余的吗?非常感谢,是的,显然我似乎想得太多了:)@JamieJamier-Yup,这在开始编程时很常见。你的逻辑是好的,所以在实际编码之前先组织好你的想法。@JamieJamier,这叫做重构。我写的很多代码都考虑得太多,包含了很多不需要的东西,但却完成了任务。然后我重构,最终得到这样的代码。我要做的唯一一件事就是检查每个链表的大小,如果你在其中处理过的话。如果它们是不同的,就不需要遍历代码的其余部分。但是,由于这似乎是一个自定义的链接列表,您可能没有大小,因此必须对每个链接列表进行迭代才能找到它。非常感谢,是的,显然我似乎想得太多了:)@JamieJamier-Yup,这在开始编程时很常见。你的逻辑是好的,所以在实际编码之前先组织好你的想法。@JamieJamier,这叫做重构。我写的很多代码都考虑得太多,包含了很多不需要的东西,但却完成了任务。然后我重构,最终得到这样的代码。我要做的唯一一件事就是检查每个链表的大小,如果你在其中处理过的话。如果它们是不同的,就不需要遍历代码的其余部分。但是,由于这似乎是一个自定义链接列表,您可能没有大小,因此必须迭代每个链接列表才能找到它。我希望我可以使用arrow up,但由于我是初学者,我只能竖起大拇指Matt我希望我可以使用arrow up,但作为初学者,我只能竖起大拇指Matt