首页 > 试题广场 >

删除有序链表中重复的元素-I

[编程题]删除有序链表中重复的元素-I
  • 热度指数:178574 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
删除给出链表中的重复元素(链表中元素从小到大有序),使链表中的所有元素都只出现一次
例如:
给出的链表为,返回.
给出的链表为,返回.

数据范围:链表长度满足 ,链表中任意节点的值满足
进阶:空间复杂度 ,时间复杂度
示例1

输入

{1,1,2}

输出

{1,2}
示例2

输入

{}

输出

{}

说明:本题目包含复杂数据结构ListNode,点此查看相关信息
/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 * };
 */
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param head ListNode类 
 * @return ListNode类
 */
struct ListNode* deleteDuplicates(struct ListNode* head ) 
{
    // write code here
    if(!head||head->next==NULL)
        return head;

    struct ListNode* temp=head;
    while(temp!=NULL&&temp->next!= NULL)
    {
        if(temp->val==temp->next->val)
            temp->next=temp->next->next;
            
        else
            temp=temp->next;
    }
    return head;
}

发表于 2024-11-21 11:10:48 回复(0)
/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 * };
 */
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param head ListNode类 
 * @return ListNode类
 */
struct ListNode* create(int value)
{
    struct ListNode* new = (struct ListNode*)malloc(sizeof(struct ListNode));
    new->val = value;
    new->next = NULL;
    return new;
}
struct ListNode* deleteDuplicates(struct ListNode* head ) {
    // write code here
    struct ListNode* new = (struct ListNode*)malloc(sizeof(struct ListNode));
    struct ListNode* cur = head, *p, *q;
    if(cur == NULL || cur->next == NULL)
    {
        return head;
    }

    new->val = cur->val;
    new->next = NULL;
    q = new;
    while(cur != NULL && cur->next != NULL)
    {
        if(cur->val == cur->next->val)
        {
            p = cur->next;
            cur->next = NULL;
            cur = p;
        }
        else 
        {
            q->next = create(cur->val);
            q = q->next;
            cur = cur->next;
        }
    }
    q->next = cur;
    return new->next;
}

将不重复的元素提出来,然后放到一个新的链表中
发表于 2024-08-16 10:12:07 回复(0)
struct ListNode* newNode(int num){
    struct ListNode* q=(struct ListNode*)malloc(sizeof(struct ListNode));
    q->val=num;
    return q;
}
struct ListNode* deleteDuplicates(struct ListNode* head ) {
    struct ListNode* p=head;
    struct ListNode* q=(struct ListNode*)malloc(sizeof(struct ListNode));
    int  num[200]={0};

    while (p) {
        if (p) {
            num[p->val+100]+=1;
            p=p->next;
        }
    }
    p=q;
    for (int i=0; i<200; i++) {
        if(num[i]!=0){
            q->next=newNode(i-100);
            q=q->next;
        }
    }
    return p->next;
}
发表于 2024-05-10 10:58:46 回复(0)
 //1.找到重复的结点
 //2.删除它
typedef struct ListNode ListNode;

//传一个前驱指针,删除其后的结点
void ListPopBack(ListNode** prev)
{
    if(!prev || !(*prev)->next)
    {
        return;
    }

    ListNode* dele = (*prev)->next;
    ListNode* next = (*prev)->next->next;

    (*prev)->next = next;
    free(dele);
    dele = NULL;
}

//遍历链表,查找与data重复的结点
//参数为需要查找的data,以及一个链表的结点
//返回值为重复结点的前驱指针prev
ListNode* ListResearch(ListNode* head, int x)
{
    if(!head)
    {
        return NULL;
    }

    ListNode* prev = NULL;
    ListNode* pcur = head;

    while(pcur->next != NULL)
    {
        prev = pcur;
        pcur = pcur->next;
        if(pcur->val == x)
        {
            return prev;
        }
    }
    if(pcur->val == x)
    {
        return prev;
    }

    //走到这里,说明没有与data重复的结点
    return NULL;
}

struct ListNode* deleteDuplicates(struct ListNode* head ) 
{
    //判断是否为空链表
    if(!head)
    {
        return NULL;
    }

    //遍历整个链表
    ListNode* compare = head;
    ListNode* delePrev = NULL;

    while(compare != NULL)
    {
        delePrev = ListResearch(compare, compare->val);
        if(delePrev != NULL)
        {
            ListPopBack(&delePrev);
        }
        else
        {
            //检查后续结点
            compare = compare->next;
        }
    }

    return head;
}

编辑于 2024-03-31 10:41:30 回复(0)
struct ListNode* deleteDuplicates(struct ListNode* head ) {
    struct ListNode *res, *p=head->next;
    if(head==NULL || head->next==NULL)
        return head;
    res = deleteDuplicates(head->next);
    while(p!=NULL) {
        if(p->val == head->val)
            return res;
        p = p->next;
    }
    head->next = res;
    return head;
}

发表于 2024-03-15 23:38:15 回复(0)
struct ListNode* deleteDuplicates(struct ListNode* head) {
    if (head == NULL) {
        return head;
    }
    if (head->next == NULL) {
        return head;
    }
    
    struct ListNode* p = head;
    struct ListNode* q = head;
    
    while (p != NULL && p->next != NULL) {
        if (p->val == p->next->val) {
            q = p->next;
            p->next = q->next;
            free(q); // 释放被删除的重复节点的内存
        } else {
            p = p->next;
        }
    }
    
    return head;
}

编辑于 2024-03-15 11:46:24 回复(0)
/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 * };
 */
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param head ListNode类 
 * @return ListNode类
 */
struct ListNode* deleteDuplicates(struct ListNode* head ) {
    // write code here
    if (head == NULL)return NULL;
    struct ListNode* pList = head;
    struct ListNode* tmp = NULL;
    while (pList) {
        tmp = pList;
        if (pList->next && pList->val == pList->next->val)
        {
            pList->next = pList->next->next;
            // 回退一个
            if (pList->next && tmp->val == pList->next->val)
            {
                pList = tmp;
                continue;
            }
        }

        pList = pList->next;//取下一个元素
    }
    return head;
}


编辑于 2024-03-06 21:30:58 回复(0)
struct ListNode* deleteDuplicates(struct ListNode* head ) {
    // write code here
    int temp;
    struct ListNode* p = head;//修改链表指向
    struct ListNode* p0 = head;//遍历被对比的元素
    while (p0!= NULL && p0->next != NULL)
    {
        temp = p0->val;//从头开始取元素进行比较
        //直到遇见下一个不重复的元素,否则被比较的指针向后移
        while(p0->next->val == temp && p0->next != NULL)
        {
            p0 = p0->next;
            continue;
        }

        p->next = p0->next;//使用p修改链表的指向,指向下一个不重复的元素
        p = p->next;//p指针向后移

        p0 = p0->next;//p0也向后移,进入下一个不重复的元素的比较

    }
    return head;
}

编辑于 2024-03-06 01:10:04 回复(1)
struct ListNode* deleteDuplicates(struct ListNode* head ) {
    if(head==NULL)
    {
        return NULL;
    }
    struct ListNode* head1=head;
    struct ListNode* phead=(struct ListNode*)malloc(sizeof( struct ListNode));
    struct ListNode* pphead=phead;
    while(head1->next)
    {
        if((head1->val)!=(head1->next->val))
        {
            struct ListNode* nest=(struct ListNode*)malloc(sizeof( struct ListNode));
            phead->next=nest;
            nest->val=head1->val;
            phead=nest;
        }
        head1=head1->next;
    }
    if((phead->val)!=(head1->val))
    {
        struct ListNode* nest=(struct ListNode*)malloc(sizeof( struct ListNode));
        phead->next=nest;
        nest->val=head1->val;
        phead=nest;
    }
    return pphead->next;

}
编辑于 2024-03-03 17:04:01 回复(0)
自我感觉良好,但就是不知道错哪里了
struct ListNode* deleteDuplicates(struct ListNode* head )
{
    // write code here

    if(head == NULL)
    {
        return head;
    }

    struct ListNode* p = NULL;
    struct ListNode *q = head;

    while(q)
    {
        q = q->next;

        if(q ->val == q->next->val)
        {
            p = q->next;
            q->next = q->next->next;
            free(p);
        }

    }
    return head;

}
编辑于 2024-01-08 20:38:52 回复(0)
struct ListNode* deleteDuplicates(struct ListNode* head ) {
    // write code here
    if (!head) {
        return NULL;
    }
    struct ListNode * pTemp = head;
    while (pTemp->next && pTemp) {
        while(pTemp->val == pTemp->next->val && pTemp->next ) {
            pTemp->next = pTemp->next->next;
        }
        pTemp = pTemp->next;
    }
    return head;
}
发表于 2023-09-08 23:59:38 回复(0)
/**
 * struct ListNode {
 *  int val;
 *  struct ListNode *next;
 * };
 */
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param head ListNode类
 * @return ListNode类
 */
struct ListNode* deleteDuplicates(struct ListNode* head )
{
    // write code here
    if(!head)
    {
        return NULL;
    }
    struct ListNode*front=head;
    struct ListNode*rear=head->next;
    while(front&&rear)
    {
        if(front->val==rear->val)
        {
            rear=rear->next;
            front->next=rear;
        }
        else
        {
            front=front->next;
            rear=rear->next;
        }
    }

    return head;
}
发表于 2023-07-06 09:27:44 回复(0)
通俗易懂的方法
struct ListNode* deleteDuplicates(struct ListNode* head ) 
{
    if(head==NULL)
        return NULL;

    struct ListNode *p = head->next;
    struct ListNode *q = head;
    struct ListNode *tmp;

    while(p!=NULL)
    {
        if(q->val==p->val)
        {
            tmp = p;
            p = p->next;
            q->next = p;
            free(tmp);
            continue;
        }
            q = q->next; 
            p = p->next;
    }

    return head;
}

发表于 2023-04-13 15:16:31 回复(0)
struct ListNode* deleteDuplicates(struct ListNode* head ) {
    // write code here
    if(head==NULL){
        return head;
    }
    if(head->next == NULL) {
        return head;
    }
    struct ListNode* p = head;
    struct ListNode* q = head;
    while(p!=NULL && p->next!=NULL) {
        if(p->val==p->next->val) {
            q = p->next;
            p->next = q->next;
        }else{
            p=p->next;
        }
    }
    return head;
}
发表于 2022-11-07 16:33:30 回复(0)
struct ListNode* deleteDuplicates(struct ListNode* head ) {
    // write code here
    if(head==0)    return 0;
    //不为空链表
    struct ListNode* p1=head;
    struct ListNode* p2=p1;
    
    while(p2!=0){
        while(p2!=0&&p2->val==p1->val){
            p2=p2->next;
        }
        p1->next=p2;p1=p2;
    }
    return head;
}

发表于 2022-08-21 20:03:30 回复(1)
struct ListNode* deleteDuplicates(struct ListNode* head) {
    // write code here
    if(head == NULL || head->next == NULL)
        return head;
    struct ListNode *tempNode;
    struct ListNode *tempNodeNext;
    tempNode = head;
    while(tempNode) {
        tempNodeNext = tempNode->next;
        if(!tempNodeNext)
            break;
        if(tempNodeNext->val == tempNode->val) {
            tempNode->next = tempNodeNext->next;
        }
        else {
            tempNode = tempNodeNext;
        }
    }
    return head;
}

发表于 2022-08-20 17:42:35 回复(0)
struct ListNode* deleteDuplicates(struct ListNode* head ) 
{
    // write code here
    if(head == NULL)
    {
        return NULL;
    }
    struct ListNode*p = head;
    while(p)
    {
     while(p->next != NULL && p->val == p->next->val)//p的下一个与p的值相等
        {
            p->next = p->next->next;//删除p的下一个结点
        }
        p = p->next;
    }
    return head;
}


发表于 2022-07-23 10:53:32 回复(1)
struct ListNode* deleteDuplicates(struct ListNode* head ) {
    if(head == NULL || head->next == NULL) return head;
    struct ListNode *p=head,*pn = head->next;
    while(p){
        if(p->val == pn->val){
            while(pn&&pn->val == p->val) pn = pn->next;
            p->next = pn;
        }
        p = p->next;
        
    }
    return head;
    // write code here
}

发表于 2022-03-16 18:51:27 回复(0)
struct ListNode* deleteDuplicates(struct ListNode* head ) {
    if (!head) return NULL;
    if (!head->next) return head;
    
    struct ListNode *cur;
    cur = head;
    while (cur->next){
        if (cur->next->val != cur->val)
            cur = cur->next;
        else{
            struct ListNode *dis = cur->next;
            cur->next = dis->next;
            dis->next = NULL;
            free(dis);
        }
    }
    return head;
}

发表于 2021-11-16 16:55:33 回复(0)