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

leetcode 82.删除链表中的重复元素II,我的消去重复元素部分的函数是有错吗,为什么相同的数消不去呢?

於炯
2023-06-26

image.png
这是我的代码实现:

typedef struct Node {
    int val;
    struct Node* next;
}Node, * ListNode;
ListNode LinkListInit();
bool createTail(ListNode L);
void printLinkList(ListNode L);
int getLen(ListNode L);

//初始化链表
ListNode LinkListInit() {
    Node* L;
    L = (Node*)malloc(sizeof(Node));   //申请结点空间 
    if (L == NULL) { //判断是否有足够的内存空间 
        printf("申请内存空间失败\n");
    }
    L->next = NULL;//将next设置为NULL,初始长度为0的单链表 
    return L;
}

//移除链表中元素
ListNode removeElements(ListNode L, int val) {
    ListNode p = NULL, q, R;
    ListNode prev = NULL;
    R = LinkListInit();
    p = L;
    if (p == NULL) {
        return NULL;
    }
    while (p) {
        if (p->val == val && p->next != NULL) {
            q = p->next;
            p->val = p->next->val;
            p->next = q->next;
            free(q);
        }
        else if (prev != NULL && p->val == val && p->next == NULL) {
            prev->next = NULL;
            free(p);
            p = NULL;
        }
        else {
            prev = p;
            p = p->next;
        }
    }
    if(L->val == val){
        return NULL;
    }else{
        return L;
    }
}

//删除链表中的元素
ListNode deleteDuplicates(ListNode L) {
    ListNode p, q,n;
    Node *prev;
    ListNode P;
    int flag = 0;
    int temp = 0;
    P = LinkListInit();
    p = L;
    if (p == NULL) {
        return NULL;
    }
    if(p != NULL && p->next != NULL && p->next->next == NULL && p->val == p->next->val){
        return NULL;
    }
    while (p) {
        prev = p;
        q = p->next;
        if (q != NULL && prev->val == q->val) {
            temp = prev->val;
            //printf("123\n");
            printLinkList(p);
            removeElements(p, prev->val);
            printLinkList(p);
        }
        else {
            p = p->next;
        }
    }
    //printLinkList(L);
    if(temp != 0){
        removeElements(L,temp);
    }
    return L;
}

//输出链表
void printLinkList(ListNode L)
{
    ListNode p;
    p = LinkListInit();
    if (L == NULL) {
        printf("L为空\n");
    }
    else {
        p = L;
    }
    if (p == NULL) {
        printf("null");
    }
    while (p)
    {
        printf("%d ", p->val);
        p = p->next;
    }
    printf("\n");
}

我的思路是这样的,首先写一个函数(removeElements)来移除链表中的指定元素,之后实现目标函数(deleteDuplicates),对链表进行循环,当遇到值相同的元素时,执行removeElements函数对相同的元素进行删除操作。
image.png
是我的removeElements函数有问题吗,为什么最后的1死活无法消去?

共有1个答案

居晗日
2023-06-26

算法同学,这么晚还在刷算法,真卷!加油
我在vc里复制了你的代码,跑了一下,发现你的removeElements函数有一处问题,导致最后的1无法被删除。在removeElements函数中,当p->val == val且p->next == NULL时,你将prev->next设置为NULL,但没有更新L的值(值的传递问题)。因此,即使你删除了最后一个元素,L仍然指向原来的链表,而不是NULL。所以,在deleteDuplicates函数中,temp不为0时,你需要将L的值更新为removeElements函数的返回值。修改removeElements函数的最后一部分如下:

if (L->val == val) {
    L = L->next;
    return L;
}
else {
    return L;
}

链表对于以后的开发非常重要,leetcode也有好几个和它有关的专门的付费专题章节(坦白的说我还没买),包含刷题和视频,印象里官方标记难度为mid,部分偏hard,内容应该也不错,可以买来多看看(我不是广告)。

 类似资料:
  • 用集合 list(set(l)) 用字典 l1 = ['b','c','d','b','c','a','a'] l2 = {}.fromkeys(l1).keys() print l2 用字典并保持顺序 l1 = ['b','c','d','b','c','a','a'] l2 = list(set(l1)) l2.sort(key=l1.index) print l2 列表推导式 l1 =

  • 这是我的代码实现: 我的思路是这样的,首先写一个函数(removeElements)来移除链表中的指定元素,之后实现目标函数(deleteDuplicates),对链表进行循环,当遇到值相同的元素时,执行removeElements函数对相同的元素进行删除操作。 这种样例可以执行成功。 但是执行这种样例时就会报错,是什么原因呢? 这是什么错误啊!

  • 问题内容: Google Python类| 清单练习- 给定一个数字列表,返回一个列表,其中所有相邻的==元素都已简化为单个元素,因此[1、2、2、3]返回[1、2、3]。您可以创建一个新列表或修改传入的列表。 我使用新列表的解决方案是- 问题甚至暗示可以通过修改传入列表来完成。但是,python文档警告不要在使用for循环迭代列表时修改元素。 我想知道除了遍历列表之外还能做些什么呢?我不是在寻找

  • 统计一个一维数组中的各个元素的个数,然后删除多出来的重复元素,并输出结果。 例如:[1,2,2,2,3,3,3,3,3]—>[1,2,3] 解决思路 将重复元素的列表中的重复元素进行统计,并将统计结果放在dictionary中,key为元素,value为该元素的个数 更新此步方法:上述步骤的功能,能够通过另外一个方法实现,即collections.Counter() 然后通过for获取key,得到

  • 本文向大家介绍Java数组,去掉重复值、增加、删除数组元素的方法,包括了Java数组,去掉重复值、增加、删除数组元素的方法的使用技巧和注意事项,需要的朋友参考一下 如下所示: 控制台结果: 以上就是小编为大家带来的Java数组,去掉重复值、增加、删除数组元素的方法全部内容了,希望大家多多支持呐喊教程~

  • 要从复杂对象中删除某些字段。 我想删除'阴谋'