链表C++的相等运算符



我正在尝试创建一个链表类,但在确定如何使用运算符==(相等运算符(检查两个列表的相等性时遇到了问题。我该如何遍历每个节点,并检查其中的元素在各自的位置上是否相等?

bool List::operator==(const List& list2) const {
    if(mySize != list2.mySize){
        return false;
    }
    if(myFirst == list2.myFirst){
        if(myFirst == NULL){
            return true;
        }
        Node * nPtr1 = myFirst;
        Node * nPtr2 = list2.myFirst;
        while(nPtr1 != NULL){
            //what can I do here to check the equality of each element in both lists?
        }
    }
}

根据您的代码,myFirst是一个指针,因此以下内容是错误的:

if(myFirst == list2.myFirst)

除非一个节点等于另一个节点,仅当它是同一个节点时(指针方式(。

当列表为空时,你会遇到一种特殊情况,你会捕捉到这种情况:

if(myFirst == nullptr && list2.myFirst == nullptr)
{
    return true;
}

这将是一个空洞的案例。

否则,你会得到适当的时间,如果你的物品(节点(可以简单地进行比较,你会这样做:

p = myFirst;
q = list2.myFirst;
while(p != nullptr)
{
    if(*p != *q)  // this is what you're asking about, right?
    {
        return false;
    }
    p = p->next; // not too sure how you have a Node separated from the List
    q = q->next; // and check next/previous items...
}
return true;

注意,如果节点只有在具有相同指针的情况下才能相等,则比较变为:

    if(p != q) // this is a test of pointers instead of objects

附言:有人提到使用递归算法。这是一个想法,从概念上讲它很棒。然而,当在现实世界中使用它时,你会注意到它可能会(慢得多(。它必须大量使用堆栈,并且列表非常大,这可能会破坏您的软件。

while(nPtr1 != NULL){
       if(nPtr1 != nPtr2){
          return false;
       }
       nPtr1=nPtr1->next;
       nPtr2=nPtr2->next;
}
return true;

但这是检查两个列表是否相同的方法(nPtr1nPtr2指向相同的列表(。如果你真的想按内容比较列表,你必须比较以下内容:

if(nPtr1->content != nPtr2->content)

并更改您的第一个指针检查:

if(myFirst->content == list.myFirst->content)

相关内容

  • 没有找到相关文章

最新更新