Laurent_Zhu 2024-03-18 02:00 采纳率: 0%
浏览 8

数据结构链表(相关搜索:单链表)

数据结构把我整不会了,有没有朋友帮我看看这段代码的问题,感激不尽!
题目:有一个整数单链表L,设计一个算法删除其中所有值为x节点,并给出算法的时间和空间复杂度。例如L=(1,2,2,3,1),x=2,删除后L=(1,3,1)。


//问:有一个整数单链表L,设计一个算法删除其中所有值为x节点,并给出算法的时间和空间复杂度。例如L=(1,2,2,3,1),x=2,删除后L=(1,3,1)。
//答:
#include<iostream>
using namespace std;

struct LinkedList
{
    int data;
    LinkedList* next;
};

void CreateList(LinkedList*& L, LinkedList*& head)
{
    LinkedList* tmp;
    L = new LinkedList();
    head = L;
    L->data = 1;
    tmp = new LinkedList();
    L->next = tmp;
    L = L->next;
    L->data = 2;
    tmp = new LinkedList();
    L->next = tmp;
    L = L->next;
    L->data = 2;
    tmp = new LinkedList();
    L->next = tmp;
    L = L->next;
    L->data = 3;
    tmp = new LinkedList();
    L->next = tmp;
    L = L->next;
    L->data = 1;
    tmp = new LinkedList();
    L->next = tmp;
    L = L->next;
    L->next = nullptr;
    delete tmp;
}
void Delete(LinkedList*& head, int del)
{
    LinkedList* prev = head;
    LinkedList* tmp;
    LinkedList* curr = prev->next;
    if (prev->data == del)
    {
        tmp = prev;
        prev = prev->next;
        head = prev;
        delete tmp;
    }
    while (curr->next != nullptr)
    {
        if (curr->data == del)
        {
            tmp = curr;
            prev->next = tmp->next;
            curr = curr->next;
            delete tmp;
        }
        else
        {
            prev = prev->next;
            curr = prev->next;
        }
    }
}

void PrintList(LinkedList* head)
{
    LinkedList* L = head;
    while (L->next != nullptr)
    {
        cout << L->data << " ";
        L = L->next;
    }
    cout << endl;
}
int main()
{
    int del = 2;
    LinkedList* L;
    LinkedList* head;
    CreateList(L,head);
    cout << "初始链表:";
    PrintList(head);
    Delete(head,del);
    cout << "删除元素"<<del<<"后的链表:";
    PrintList(head);
    delete head;
    
    return 0;
}

运行结果是这样的:

img


真的整不会了

  • 写回答

5条回答 默认 最新

  • 关注

    Laurent_Zhu 上午好☀️☀️☀️️
    本答案参考ChatGPT-3.5

    问题的代码存在一些问题导致程序运行时出现错误。下面是对代码的问题进行分析和修改建议:

    1. 在Delete函数中,判断链表中的节点值是否为要删除的值时,应该使用while循环而不是if条件语句。因为要删除的节点可能不止一个,需要遍历整个链表来找到所有的要删除的节点。

    2. 在Delete函数的while循环中,应该先更新prev和curr指针的位置,然后再进行节点的删除操作。否则会导致删除节点后,prev和curr指针指向错误的位置。

    3. 在Delete函数的while循环中,如果要删除的节点是最后一个节点,那么curr指针会指向最后一个节点的下一个节点nullptr,此时应该退出循环。

    下面是修改后的代码:

    void Delete(LinkedList*& head, int del)
    {
        LinkedList* prev = head;
        LinkedList* tmp;
        LinkedList* curr = prev->next;
        if (prev->data == del)
        {
            tmp = prev;
            prev = prev->next;
            head = prev;
            delete tmp;
        }
        while (curr != nullptr)
        {
            if (curr->data == del)
            {
                tmp = curr;
                prev->next = curr->next;
                curr = curr->next;
                delete tmp;
            }
            else
            {
                prev = prev->next;
                curr = curr->next;
            }
        }
    }
    

    接下来是算法的时间和空间复杂度分析。

    • 时间复杂度:该算法需要遍历整个链表,对于每个节点,最坏情况下需要删除,因此时间复杂度为O(n),其中n为链表中的节点个数。

    • 空间复杂度:除了原有的链表外,算法没有使用额外的空间,因此空间复杂度为O(1)。

    评论

报告相同问题?

问题事件

  • 创建了问题 3月18日

悬赏问题

  • ¥15 可以实现这个有不同背景颜色的九九乘法表吗?
  • ¥50 python写segy数据时出错2
  • ¥20 关于R studio 做精确稳定检验的问题!(语言-r语言)
  • ¥50 用贝叶斯决策方法,设计CAD程序
  • ¥20 关于#目标检测#的问题:(qq收集表到时间才能填写,填写的份数有上限)
  • ¥50 ZYNQ7020双核FLAHS烧写的问题
  • ¥20 ue 5 中想要实现第一人称人物左右行走摆动的效果,摄像头只向右摆动一次(关键词-结点)
  • ¥15 AD9164瞬时带宽1.8G,怎么计算出来?
  • ¥15 鼠标右键,撤销删除 复制 移动,要怎样删除? HKEY_CLASSES_ROOT*\shellex\ContextMenuHandlers 没用
  • ¥15 服务器安装php5.6版本