LeetCode 82. Remove Duplicates from Sorted List II pre指针,首元素的处理

来源:互联网 发布:tfboys三只的关系知乎 编辑:程序博客网 时间:2024/06/27 03:09

    • 题目
      • 题意
      • 注意
      • 思路
      • 代码
      • 结果

题目

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.

题意

给定一个有序的链表,删除所有重复结点,仅仅留下出现过一次的结点

注意

  • 根据题意知道,是删除所有的重复的结点
  • 作为重复元素中第一个元素应该如何处理
  • 和82. Remove Duplicates from Sorted List 203. Remove Linked List Elements的区别。

思路

1.设置三个指针pre,cur,next。pre指向cur前一个元素,next往后一位查找和cur的值是否相等,当没有相等时,pre移动到cur的位置,cur往前走一步。
2.当next往后一位找到和cur有相等的,就删除next指向的结点,并继续往后一位看和cur是否相等,相等继续删除,不等退出循环。在这个过程中需要维护好cur->next和next->next的信息。
3.继续第二步骤,当cur之后和它相等的已经删除完毕退出循环,说明cur本身是重复元素的起始元素,继续对cur进行删除,cur指向下一个不重复元素。

代码

class Solution {public:    ListNode* deleteDuplicates(ListNode* head) {        ListNode *virtualNode = new ListNode(0);        virtualNode->next = head;           ListNode* cur = virtualNode->next;  //这就是虚拟结点的存在的理由,从虚拟结点处当做当前结点        //判断的是当前结点的下一结点        ListNode* pre = virtualNode;        while (cur != NULL)        {            ListNode* next = cur->next;            bool flag = false;   //用来处理重复元素的第一位元素            while (next != NULL)            {                if (cur->val == next->val)                {                    ListNode* dele = next;                    //cur和next处理的结果不可以一致                    cur->next = next->next;                    //cur = cur->next;                    next = next->next;                    delete dele;                    flag = true;                }                else                {                    break;                }            }            if (flag)            {                                    ListNode* firstdele = cur;                //有重复元素,一定要在这里处理cur,否则马上执行删除操作                cur = cur->next;                delete firstdele;                pre->next = cur;                continue;            }            else            {                //当没有重复元素的时候,pre指向当前的cur的结点                //而cur马上需要更新到下一结点                pre = cur;            }            cur = cur->next;        }        ListNode* retNode = virtualNode->next;        delete virtualNode;        return retNode;    }};

结果

这里写图片描述

阅读全文
0 0
原创粉丝点击