删除链表中重复的结点

在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表 1->2->3->3->4->4->5  处理后为 1->2->5

数据范围:链表长度满足 0≤�≤1000 0≤n≤1000  ,链表中的值满足 1≤���≤1000 1≤val≤1000 

进阶:空间复杂度 �(�) O(n)  ,时间复杂度 �(�) O(n) 

例如输入{1,2,3,3,4,4,5}时,对应的输出为{1,2,5},对应的输入输出链表如下图所示:

示例1

输入:

{1,2,3,3,4,4,5}

复制返回值:

{1,2,5}

复制

示例2

输入:

{1,1,1,8}

复制返回值:

{8}

/**

 * struct ListNode {

 *  int val;

 *  struct ListNode *next;

 * };

 */

方法1:规避方法,因为数据范围为0~1000,可以遍历链表的数据,然后做标记,只把出现过一次的节点添加到新的节点里。

/**

 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可

 *

 *

 * @param pHead ListNode类

 * @return ListNode类

 */

#include <stdlib.h>

struct ListNode* deleteDuplication(struct ListNode* pHead ) {

    int array[1001] ={0};

    int i = 0;

    struct ListNode* tmpListNode = pHead;

    struct ListNode* firstNode =(struct ListNode*) malloc(sizeof(struct ListNode));

    struct ListNode* outListNode = firstNode;

    memset(firstNode, 0, sizeof(struct ListNode));

    while(tmpListNode != NULL){

       array[tmpListNode->val]++;

       tmpListNode = tmpListNode->next;

    }

    tmpListNode = pHead;

    while(tmpListNode) {

        if(array[tmpListNode->val] == 1){

            //printf("%d\n",tmpListNode->val);

            firstNode->next = tmpListNode;

            firstNode = firstNode->next;

        }

        tmpListNode = tmpListNode->next;

    }

    firstNode->next = NULL;

    return outListNode->next;

}

/**

 * struct ListNode {

 *  int val;

 *  struct ListNode *next;

 * };

 */

/*方法2: 设置前驱节点pre,一直指向最终实际的节点值; pre->next指向有可能的下一个节点;cur指向当前节点,并不断往后遍历*/

/**

 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可

 *

 *

 * @param pHead ListNode类

 * @return ListNode类

 */

#include <stdlib.h>

struct ListNode* deleteDuplication(struct ListNode* pHead ) {

    struct ListNode* vHead = (struct ListNode*)malloc(sizeof(struct ListNode));

    memset(vHead, 0, sizeof(struct ListNode));

    struct ListNode* pre = vHead;

    struct ListNode* cur = pHead;

    if(cur->next == NULL || cur == NULL)

        return cur;

    while(cur){

        if(cur->next != NULL && cur->val ==cur->next->val){

            cur = cur->next;

            while(cur->next != NULL && cur->val ==cur->next->val) {

                cur = cur->next;

            }

            cur = cur->next;

            pre->next = cur;

        } else if(cur->next == NULL || cur->val !=cur->next->val){

            pre->next = cur;

            pre = cur;

            cur = cur->next;

        }

    }

    return vHead->next;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值