当前位置: 首页 > 知识库问答 >
问题:

链表(删除节点)

彭浩穰
2023-03-14

我的问题是,如果用户输入一个姓氏,并且在链接列表中有多个相同的姓氏,并且其中一个姓氏在head节点中。如何在不删除头部节点的情况下删除另一个姓氏。我尝试了一些我能想到的方法,但是删除了所需的节点(这很好),包括头部节点(这不是我想要的…)

void NumberList::deleteCertainRecord()
{
string lname = "";

ListNode *ptr;
ptr = head;
string answer;
cout << "Please enter last name: "<<endl;
cin>>answer;
int num = 0;
char confirm;
while (ptr!= NULL){
    lname = ptr -> data.person.getLastName();

    if(lname == answer){
        num++;
        cout << "Person found : ";
        cout << ptr->data.person.getTitle()<<" " << ptr -> data.person.getFirstName() << " " << ptr -> data.person.getLastName() << endl << endl;
        cout << "Do you want to delete his/her record? [Y/N]" << endl;
        do{
            cin >> confirm;
            if(confirm=='Y'||confirm=='y'){
                    ListNode *previousNode;

                    if(isEmpty()){
                        return;
                    }

                    else if(head->data.person.getLastName() == answer){
                        ptr = head->next;
                        delete head; 
                        head = ptr;
                    }

                    else{
                        ptr = head;

                        while(ptr!=NULL && ptr->data.person.getLastName() != answer){
                            previousNode = ptr;
                            ptr = ptr->next;
                        }

                        if(ptr==NULL){
                            cout<< "Node not found!" << endl;
                            return;
                        }
                        else{
                            previousNode->next = ptr->next;
                            delete ptr; 
                        }
                    }
                    cout << endl << "Deleting..."<<endl;
                    cout << "Done!!" <<endl;
                    cout << "Exiting delete function... "<<endl;
                    return;
            }
            else if(confirm=='N'||confirm=='n'){
                break;
            }
            else{
                cout << "invalid input, please enter again!!" << endl;
            }
        }while(confirm!='Y'&&confirm!='y'&&confirm!='n'&& confirm!='N');
        cout << endl;
    }

    ptr = ptr -> next;
}
if (num == 0){
    cout << "\nNo person with the last name ("<< answer << ") was found!" << endl;
    cout << "Exiting delete function... "<<endl;
    return;
}
}

共有1个答案

李烨烁
2023-03-14

执行此操作所使用的代码数量之多,给实际意图蒙上了阴影。

  • 您有一个人员的链接列表

如果节点实际上是头节点,那么删除部分显然有问题。对于新接触链表的人来说,特殊情况的头节点逻辑总是很棘手。幸运的是,如果你使用正确的算法,它可以被完全规避。假设您的列表正确地以NULL终止,如果列表为空,则包括NULL头指针,这样的算法如下:

ListNode ** pp = &head;
while (*pp)
{
    if ((*pp)->data.person.getLastName() == answer &&
         confirmDelete((*pp)->data.person)) // <== TODO: write this function
    {
        ListNode *victim = *pp;
        *pp = victim->next;
        delete victim;
    }
    else
    {   // just advance to next person
        pp = &(*pp)->next;
    }
}

这将正确删除用户,即使他们是列表中的第一个节点,并为您正确推进头指针。它也适用于具有和不具有匹配条件的单节点列表,甚至适用于head为NULL的空列表。这种技术使用列表中的指针作为枚举列表的机制;不仅仅是它们的值,还有实际的指针。

最后,如果您保持列表排序,这可以大大提高效率,但我把它留给您。

 类似资料:
  • 我有一种工作方法,可以在给定键的情况下删除链表中的节点。那时我将节点类嵌套在LinkedList类中,可以直接访问节点类的成员(例如head.next和head.data)。我对代码进行了重构,使其具有一个单独的节点类,并为数据和下一个成员设置了访问器和mutator方法。(我正在准备面试,所以我正在处理许多linkedlist问题,所以我认为有一个单独的类可以让我不必复制和粘贴很多代码。 这是我

  • 我有一个基本的链表问题,我在下面试图解决。如果您能为我的方法、算法的正确性(甚至是编码风格)提供任何信息,我将不胜感激。该问题需要一个函数,该函数删除循环链表中所有出现的int,并返回列表中的任何节点或NULL(当列表为NULL时)。 以下是我目前掌握的一些C代码:

  • 这是我的remove函数,用于删除具有元素的节点。我得到了一个seg错误,我很确定这是因为temp->prev是前面的哨兵,所以从技术上来说,它不在双链表中。如果这是正确的,我实际上如何防止这种情况?如有任何帮助,不胜感激。 编辑:刚刚更新了代码,但仍然出现了Seg错误

  • 问题内容: 这段代码是一个表,可以选择“惰性名称”,“删除”,“显示”和“退出”。 该代码运行良好,但是我唯一的问题是如何删除节点中的所选名称 *我不知道如何删除节点。我应该在删除方法上加上什么? 问题答案: 要删除Node,您实际上需要更新它的上一个节点的位置以删除Node的位置,而剩下的Node最终将被垃圾回收。 如果要删除的节点是根节点,则只有一个问题,然后更新根节点。

  • 我试图从基于阉羊的双链表中删除一个元素,该列表中的节点满足返回bool的函数。由于某种原因,替换节点的前一个指针(下一个被删除)不更新,而是引用回它自己。 我的代码 测试结果

  • 给定一个链表和一个指定的数据值,我想递归地删除包含所述数据的所有节点。(我已经找到了迭代的方法,但我想这样做)。我已将我的结构定义为: 为了删除,我做了这个助手函数,它(应该)返回指向我删除列表的头节点的指针: 然后我想在我的实际列表中使用它: 但这不起作用。看起来我的助手函数实际上不起作用,但我无法理解。出什么事了?