- head 总结赋值后 ,head是不发生改变的、 
 - 使用双指针,相等的时候slow不变,不对等的时候先改变next指针指向fast,然后slow直接跑到fast所在位置,然后fast向下继续走,准备迎接接下来的继续遍历。 
 - 最后slow->next 后的要置NULL,fast为空的时候返回。 
 - 最后返回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;
    }
};