LeetCode 83. Удалить дубликаты из отсортированного списка

class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        ListNode *cur = head;
        
        while (cur && cur->next) {
            if (cur->val == cur->next->val)
                cur->next = cur->next->next;        
            else
                cur = cur->next;        
        }
        
        return head;
    }
};

Сначала создается указатель cur, указывающий на заголовок, который является указателем на заданный связанный список, затем мы собираемся манипулировать указателем cur.

В цикле while, хотя cur не является null, это на самом деле помогает в ситуации, когда головы равны nullptr, так что программа прервет цикл while и вернет head в качестве решения. Пока действует cur->next, будем делать кое-что интересное под капотом.

Итак, если текущее значение, обозначенное как cur->val, равно следующему значению, обозначенному как cur->next->val, то удалите следующий узел. В этом случае мы перемещаем указатель next следующего узла и заставляем его указывать на указатель next следующего узла. В противном случае текущий указатель будет перемещен к следующему значению next pointer. После этого цикла while мы проверяем все узлы связанного списка и убеждаемся, что не существует повторяющихся значений. Чисто и эффективно. Сделанный.