1. head 总结赋值后 ,head是不发生改变的、
  2. 使用双指针,相等的时候slow不变,不对等的时候先改变next指针指向fast,然后slow直接跑到fast所在位置,然后fast向下继续走,准备迎接接下来的继续遍历。
  3. 最后slow->next 后的要置NULL,fast为空的时候返回。
  4. 最后返回head
/**
 * struct ListNode {
 *    int val;
 *    struct ListNode *next;
 * };
 */

class Solution {
public:
    /**
     * 
     * @param head ListNode类 
     * @return ListNode类
     */
    ListNode* deleteDuplicates(ListNode* head) {
        // write code here
        if(!head) return NULL;

        ListNode* slow = head;
        ListNode* fast = head;

        while(fast!=NULL){
            if(fast->val!=slow->val){
                slow->next = fast;
                slow = slow->next;
            }

            fast = fast->next;
        }

        slow->next = NULL;


        return head;
    }


};