LeetCode(Remove Duplicates from Sorted List) 两道删除排序链表中重复数字

题目要求:

Given a sorted linked list, delete all duplicates such that each element appear only once.

For example,
Given 1->1->2, return 1->2.
Given 1->1->2->3->3, return 1->2->3.

代码:

ListNode *deleteDuplicates(ListNode *head) {
    if(head == NULL  || head->next == NULL)
      return head;
    ListNode* pre = head, *cur = head->next;
    while(cur != NULL)
    {
      if(pre->val == cur->val)
      {
        pre->next = cur->next;
        delete cur;
        cur = pre->next;
      }
      else 
      {
        pre = cur;
        cur = cur->next;
      }
    }
    return head;
  }


题目二 要求:

Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.

For example,
Given 1->2->3->3->4->4->5, return 1->2->5.
Given 1->1->1->2->3, return 2->3.

代码:

ListNode *deleteDuplicates(ListNode *head) {
    if(head == NULL || head->next == NULL)
      return head;
    ListNode* virtual_head = new ListNode(0);
    virtual_head->next = head;
    ListNode* del_begin = virtual_head;//添加一个虚拟头结点方便删除头结点
    
    while(del_begin != NULL)
    {
      ListNode* del_end = del_begin->next;
      while(del_end != NULL && del_end->next != NULL && 
            del_end->next->val == del_end->val)//找到要删除重复区间的最后一个节点
      {
        del_end = del_end->next;
      }
      if(del_begin->next != del_end && del_end != NULL)//如果有重复区间存在,将del_begin节点的下一位指向del_end的下一个节点,并逐个删除区间中的节点
      {
        ListNode* node = del_begin->next;
        del_begin->next = del_end->next;
        while(node != del_end)
        {
          ListNode* pnext = node->next;
          delete node;
          node = pnext;
        }
        delete del_end;
      }
      else 
        del_begin = del_begin->next;
    }
    return virtual_head->next;
  }



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值