数据结构:顺序表与链表经典算法实战
本文整理了顺序表和链表的高频算法题,涵盖双指针、快慢指针等核心技巧。以下代码均基于 C/C++ 实现,注重逻辑清晰与边界处理。
顺序表算法(双指针法)
移除元素
思路: 使用双指针 src 和 dst。src 负责探路寻找非目标值,dst 负责记录有效数据的位置。当 nums[src] 不等于目标值时,将其赋值给 nums[dst],随后两个指针同时前进;否则仅 src 前进。
- 时间复杂度: O(N)
- 空间复杂度: O(1)
int removeElement(int* nums, int numsSize, int val) {
int src = 0, dst = 0;
while (src < numsSize) {
if (nums[src] != val) {
nums[dst++] = nums[src];
}
src++;
}
return dst;
}
删除有序数组中的重复项
思路: 同样是双指针。dst 指向当前不重复部分的末尾,src 向后遍历。若 nums[src] 与 nums[dst] 不同,则 dst 后移并覆盖新值。注意优化:当 dst + 1 == src 时,无需赋值,直接跳过。
- 时间复杂度: O(N)
- 空间复杂度: O(1)
int removeDuplicates(int* nums, int numsSize) {
if (numsSize == 0) return 0;
int src = 1, dst = 0;
while (src < numsSize) {
if (nums[src] != nums[dst]) {
nums[++dst] = nums[src];
}
src++;
}
return dst + ;
}


