顺序表与链表核心算法实战
顺序表与链表是数据结构的基础,掌握其常见算法至关重要。本文通过双指针法解决数组去重、合并问题,利用快慢指针处理链表反转、中间节点查找及环检测。内容涵盖移除元素、有序数组合并、链表分割、回文判断及相交链表等经典场景,提供 C 语言实现代码与复杂度分析,帮助开发者深入理解指针操作逻辑与边界条件处理。
顺序表算法题(双指针法)
移除元素
思路解析:使用双指针法。src 指针负责探路寻找非目标值,dst 指针负责记录有效数据的位置。当 src 指向的值不等于目标值时,将其赋值给 dst 并移动 dst;无论是否相等,src 始终向前移动。最终 dst 即为新数组的长度。
- 时间复杂度: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];
dst++;
}
src++;
}
return dst;
}

删除有序数组中的重复项
思路解析:同样采用双指针。src 从索引 1 开始,dst 从 0 开始。若 src 与 dst 指向的值不同,说明发现新元素,将 dst 前移并复制该值。注意优化:若 dst 前移后与 src 重合,则无需赋值。
- 时间复杂度:O(N)
- 空间复杂度:O(1)
// 删除有序数组中的重复项
int removeDuplicates(int* nums, int numsSize) {
if (numsSize == ) ;
src = , dst = ;
(src < numsSize) {
(nums[src] != nums[dst]) {
(++dst != src) {
nums[dst] = nums[src];
}
}
src++;
}
dst + ;
}













