删除有序数组中的重复项
给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。
考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:
1.更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。
2.返回 k 。
示例 1:
输入:nums = [1,1,2]
输出:2, nums = [1,2,_]
解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。
示例 2:
输入:nums = [0,0,1,1,1,2,2,3,3,4]
输出:5, nums = [0,1,2,3,4]
解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。
空链表检查:if (!head) { return head; } 这一行检查传入的链表是否为空(即head是否为nullptr)。如果是空链表,函数直接返回head,因为空链表没有元素可以删除。
迭代链表:ListNode* cur = head; 这一行初始化一个指针cur,指向链表的头节点,用于遍历链表。
循环条件:while (cur->next) 这个循环会一直执行,直到cur指向的节点没有下一个节点,即cur->next为nullptr。
检查重复元素:if (cur->val == cur->next->val) 这一行检查当前节点cur的值是否与其下一个节点的值相同。如果是,说明找到了一个重复元素。
删除重复元素:cur->next = cur->next->next; 如果发现重复元素,这行代码将cur的next指针指向下一个节点的下一个节点,从而删除了重复的节点。
移动到下一个节点:else { cur = cur->next; } 如果当前节点的值与其下一个节点的值不同,说明没有重复,cur指针移动到下一个节点。
返回结果:return head; 在循环结束后,函数返回链表的头节点指针head,此时链表中的所有重复元素已经被删除。
具体代码如下:
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if (!head) {
return head;
}
ListNode* cur = head;
while (cur->next) {
if (cur->val == cur->next->val) {
cur->next = cur->next->next;
}
else {
cur = cur->next;
}
}
return head;
}
};