C++ 链表的赋值运算符 #包括 使用名称空间std; 类链接列表 { 私人: 结构列表节点 { int值; 结构ListNode*next; }; ListNode*头; 公众: LinkedList() { head=NULL; } ~LinkedList(); 常量链接列表和运算符=(常量链接列表和rhs); 节点无效(int); void insertNode(int); 无效删除节点(int); ListNode*removeLast(); }; void LinkedList::appendNode(int num) { ListNode*newNode; ListNode*nodePtr; newNode=新的ListNode; newNode->value=num; newNode->next=NULL; 如果(!头) { 头=新节点; } 其他的 { nodePtr=头部; while(nodePtr->next) { nodePtr=nodePtr->next; } nodePtr->next=newNode; } } void LinkedList::insertNode(int num) { ListNode*newNode; ListNode*nodePtr; ListNode*preNode; newNode=新的ListNode; newNode->value=num; 如果(!头) { 头=新节点; newNode->next=NULL; } 其他的 { nodePtr=头部; preNode=NULL; while(nodePtr->next) { preNode=nodePtr; nodePtr=nodePtr->next; } if(!preNode)//如果新节点是列表中的第一个节点 { 头=新节点; newNode->next=nodePtr; } 其他的 { preNode->next=newNode; newNode->next=nodePtr; } } } void LinkedList::deleteNode(int num) { ListNode*nodePtr; ListNode*preNode; 如果(!头) 返回; 如果(头->值==num) { nodePtr=head->next; 删除标题; head=nodePtr; } 其他的 { nodePtr=头部; while(nodePtr!=NULL&&nodePtr->value!=num) { preNode=nodePtr; nodePtr=nodePtr->next; } if(nodePtr) { preNode->next=nodePtr->next; 删除nodePtr; } } } 常量链接列表和链接列表::运算符=(常量链接列表和rhs) { 如果(此!=&rhs) { ListNode*curr,*nextNode; curr=头; nextNode=NULL; while(curr) { nextNode=当前->下一步; 删除curr; curr=nextNode; } ListNode*cptr=新ListNode; cptr=右侧头部; cptr->next=NULL; 温度=右侧头部->下一步; while(临时) { cptr->next=新建列表节点; cptr->next=温度; cptr=cptr->next; cptr->next=NULL; 温度=右侧头部->下一步; } } 归还*这个; } LinkedList::ListNode*LinkedList::removeLast() { ListNode*nodePtr,*preNode; 如果(!头) { 返回; } nodePtr=头部; preNode=NULL; while(nodePtr->next) { preNode=nodePtr; nodePtr=nodePtr->next; } preNode->next=NULL; 返回nodePtr; } LinkedList::~LinkedList() { ListNode*nodePtr; ListNode*nextNode; nodePtr=头部; while(nodePtr) { nextNode=nodePtr->next; 删除nodePtr; nodePtr=nextNode; } }

C++ 链表的赋值运算符 #包括 使用名称空间std; 类链接列表 { 私人: 结构列表节点 { int值; 结构ListNode*next; }; ListNode*头; 公众: LinkedList() { head=NULL; } ~LinkedList(); 常量链接列表和运算符=(常量链接列表和rhs); 节点无效(int); void insertNode(int); 无效删除节点(int); ListNode*removeLast(); }; void LinkedList::appendNode(int num) { ListNode*newNode; ListNode*nodePtr; newNode=新的ListNode; newNode->value=num; newNode->next=NULL; 如果(!头) { 头=新节点; } 其他的 { nodePtr=头部; while(nodePtr->next) { nodePtr=nodePtr->next; } nodePtr->next=newNode; } } void LinkedList::insertNode(int num) { ListNode*newNode; ListNode*nodePtr; ListNode*preNode; newNode=新的ListNode; newNode->value=num; 如果(!头) { 头=新节点; newNode->next=NULL; } 其他的 { nodePtr=头部; preNode=NULL; while(nodePtr->next) { preNode=nodePtr; nodePtr=nodePtr->next; } if(!preNode)//如果新节点是列表中的第一个节点 { 头=新节点; newNode->next=nodePtr; } 其他的 { preNode->next=newNode; newNode->next=nodePtr; } } } void LinkedList::deleteNode(int num) { ListNode*nodePtr; ListNode*preNode; 如果(!头) 返回; 如果(头->值==num) { nodePtr=head->next; 删除标题; head=nodePtr; } 其他的 { nodePtr=头部; while(nodePtr!=NULL&&nodePtr->value!=num) { preNode=nodePtr; nodePtr=nodePtr->next; } if(nodePtr) { preNode->next=nodePtr->next; 删除nodePtr; } } } 常量链接列表和链接列表::运算符=(常量链接列表和rhs) { 如果(此!=&rhs) { ListNode*curr,*nextNode; curr=头; nextNode=NULL; while(curr) { nextNode=当前->下一步; 删除curr; curr=nextNode; } ListNode*cptr=新ListNode; cptr=右侧头部; cptr->next=NULL; 温度=右侧头部->下一步; while(临时) { cptr->next=新建列表节点; cptr->next=温度; cptr=cptr->next; cptr->next=NULL; 温度=右侧头部->下一步; } } 归还*这个; } LinkedList::ListNode*LinkedList::removeLast() { ListNode*nodePtr,*preNode; 如果(!头) { 返回; } nodePtr=头部; preNode=NULL; while(nodePtr->next) { preNode=nodePtr; nodePtr=nodePtr->next; } preNode->next=NULL; 返回nodePtr; } LinkedList::~LinkedList() { ListNode*nodePtr; ListNode*nextNode; nodePtr=头部; while(nodePtr) { nextNode=nodePtr->next; 删除nodePtr; nodePtr=nextNode; } },c++,linked-list,copy-constructor,assignment-operator,C++,Linked List,Copy Constructor,Assignment Operator,谢谢那些帮助我的人 我修复了赋值运算符和removeLast函数 对于removeLast,倒数第二个节点将指向null,然后返回最后一个节点 我不确定我的赋值运算符是否正常 以及removeLast功能 如果你们发现了错误,请告诉我 再次感谢你 另外,你们能教我如何声明“ListNode*removeLast();”吗 您刚刚跨越了返回类型和类,但是ListNode也在LinkedList中声明,因此无论何时使用它,都必须将其指定为“LinkedList::ListNode” 据我所知,你的破

谢谢那些帮助我的人

我修复了赋值运算符和removeLast函数

对于removeLast,倒数第二个节点将指向null,然后返回最后一个节点

我不确定我的赋值运算符是否正常

以及removeLast功能

如果你们发现了错误,请告诉我

再次感谢你

另外,你们能教我如何声明“ListNode*removeLast();”吗

您刚刚跨越了返回类型和类,但是ListNode也在LinkedList中声明,因此无论何时使用它,都必须将其指定为“LinkedList::ListNode”

据我所知,你的破坏者似乎找到了。您只需将一个指针设置为另一个指针,这不会触发复制构造函数

至于创建深度拷贝,指针只保存内存地址,而不是内存地址本身

LinkedList::ListNode* LinkedList::removeLast()
只创建一个指向头部节点的指针。要制作副本,您必须执行以下操作:

ListNode *node = head;
还是这个

ListNode node = *head; // sometimes brackets such as (*head) avoids errors


在指针名称为“反引用”之前。它是指向指向的对象的引用,而不是指针变量。然后可以使用普通复制语义。对于非常简单的类(即所有简单对象),默认的复制行为就足够了。

也存储“tail”节点,这样就不必搜索整个列表来查找最后一个节点。(对于appendNode)是的,我知道tail对运行时间有很大帮助,但是,我只想首先完全理解SLL。谢谢你给我小费!在insertMode中,您放弃将内存分配给newNode,这样做newNode=NewListNode;您可以为ListNode创建一个默认构造函数,在该构造函数中,您可以将next赋值为NULL,以便在创建新节点时,其next为NULL。另一个技巧是在创建列表时为head创建一个“虚拟”节点。你不能把它算作真正的节点。那么你就不需要做“is head null”检查了。如果语句在性能方面代价高昂,并且由于不检查而减少的代码弥补了头节点的额外空间。在destructor中,您将删除所有节点,为该like(deleteAll)生成seprate私有函数,并从析构函数和赋值重载中调用它。
ListNode node = *head; // sometimes brackets such as (*head) avoids errors
ListNode *node = new ListNode;
*node = *head;
*