1. 程式人生 > >LeetCode(Remove Duplicates from Sorted List) 兩道刪除排序連結串列中重複數字

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;
  }