zoukankan      html  css  js  c++  java
  • 83. 删除排序链表中的重复元素

    给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。

    示例 1:

    输入: 1->1->2
    输出: 1->2
    示例 2:

    输入: 1->1->2->3->3
    输出: 1->2->3

    我写的错误代码:

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     struct ListNode *next;
     * };
     */
    
    
    struct ListNode* deleteDuplicates(struct ListNode* head){
    
    struct ListNode *p=(struct ListNode *)malloc(sizeof(struct ListNode));
    head->next=p;
    if(p->val==head->val)
    {
        head->next=p->next;
        free(p);
        head=head->next;
    
    }
    else{
        head=head->next;
    }
    return head->next;
    }
    

      报的错:

     内存无法打印,可能是存在野指针的问题

    修改后正确的代码:

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     struct ListNode *next;
     * };
     */
    
    
    struct ListNode* deleteDuplicates(struct ListNode* head){
    if(!head)
      return NULL;
    
    struct ListNode *p=head;
    struct ListNode *temp=NULL;
    while(p!=NULL&&p->next!=NULL)
    {
    if(p->val==p->next->val)
    {
        temp=p->next;
        p->next=p->next->next;
        free(temp);
    
    }
    else{
        p=p->next;
    }
    }
    return head;
    }
    

    主要问题分析:

    头指针是表示当前链表信息的没有实际意义的节点,而首节点是链表中第一个含有实际意义的值

    有一个问题就是什么时候需要声明节点,什么时候直接使用还是没搞清楚

     把上面直接使用节点变成下面这句话的时候,就会报错,说明*p节点是不需要重新申请就可以直接使用的

    这个错误需要搞清楚:

    我的理解是这样的,*p是新申请的指针变量,他指向的是链表的头结点,所以无需新分配地址空间。

    如果以后看的链表东西多了,目前的结论被推翻了,那就回来再修改一下

  • 相关阅读:
    configparser模块
    xml文件解析
    shutil模块 + shelve模块 二合一版
    hashlib模块
    subprocess模块和sys模块
    re模块
    os模块
    random模块
    time模块、datetime模块讲解
    洛谷P3414 SAC#1
  • 原文地址:https://www.cnblogs.com/redzzy/p/13276459.html
Copyright © 2011-2022 走看看