该回答引用ChatGPT
这两段代码都想实现在链表尾部添加一个新节点。但是第一段代码有问题,会导致无限循环。原因是:
第一段代码:
cpp
void LinkList::add()
{
record* cur = new record;
record* ptr = new record ;
strcpy_s(cur->name, getname());
cur->score = this->score;
cur->next = nullptr;
record* temp=this->head->next;
while(temp->next! = nullptr) // 问题在这一行
temp = temp->next;
temp->next = cur;
}
在这段代码中,temp最开始指向head的下一个节点。而在while循环内,只要temp->next不为空,就继续让temp指向下一个节点。
问题在于,如果链表为空或只有一个节点,temp->next就是null,导致while循环永不退出,产生无限循环。
第二段代码修正了这个问题:
cpp
void LinkList::add()
{
record* cur = new record;
record* ptr = new record ;
strcpy_s(cur->name, getname());
cur->score = this->score;
cur->next = nullptr;
record* temp=this->head;
while(temp->next != nullptr)
temp = temp->next;
temp->next = cur;
}
在这段代码中,temp最开始就指向头节点head,而非head的下一个节点。那么无论链表是否为空,while循环都会正常退出。temp会指向链表的最后一个节点,并将新节点cur追加到该节点后。
所以第二段代码修正了第一个代码片段的问题,避免了无限循环的产生,实现了链表尾部添加节点的功能。
1)将链表根据奇偶顺序拆成两个链表
2)将偶数位拆成的链表反转
3)将两个链表合并