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

leetcode 82.删除链表中的重复元素II,我的代码为什么有的可以实现,有的不行?

松雅健
2023-06-21

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;
    ListNode prev;//prev用来记录p的前驱节点
    prev = 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 = p->next;
            free(p);
            p = NULL;
        }
        else {
            prev = p;
            p = p->next;
        }
    }
    return L;
}

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

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

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

共有2个答案

韦睿
2023-06-21

所有节点都一样的时候,L 指向的节点在 removeElements 里也被释放了。所以 return L 返回了一个野指针。

公德明
2023-06-21

这题我会~
leetcode 上如果一道题要求返回 true 或者 false 时

我直接返回 true 可以通过 50% 的测试用例
至于另外 50% ,我可以直接返回 false

 类似资料:
  • 需要以这种形式解决 没有使用的最后一个字符

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

  • 本文向大家介绍Java实现删除排序链表中的重复元素的方法,包括了Java实现删除排序链表中的重复元素的方法的使用技巧和注意事项,需要的朋友参考一下 给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。 示例 1: 输入: 1->1->2 输出: 1->2 示例 2: 输入: 1->1->2->3->3 输出: 1->2->3 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多

  • 我正在编写一个函数,该函数应该删除链表的最后一个元素 这是我对节点的定义 我有一个节点列表1,它为值1、2、3运行了3次insert函数 insert函数如下所示 现在我的delete_last_element函数如下所示 基本上,我的想法是,我会先看看第一个元素是否为空,如果是,我什么也不做,因为没有最后一个元素。然后我将curr设置为head->next以查看列表中的下一个元素,如果它为nul

  • 请检查这段代码,看看@Arun R在如何计算覆盖另一个矩形的矩形面积中所说的算法有什么问题 为什么它没有删除其他内部的矩形

  • 本文向大家介绍 一行代码实现删除列表中重复的值相关面试题,主要包含被问及 一行代码实现删除列表中重复的值时的应答技巧和注意事项,需要的朋友参考一下