线性表
线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使 用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串…
线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的, 线性表在物理上存储时,通常以数组和链式结构的形式存储。
顺序表
2.1概念及结构
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存 储。在数组上完成数据的增删查改。
顺序表一般可以分为:
- 静态顺序表:使用定长数组存储。
- 动态顺序表:使用动态开辟的数组存储。----使用malloc或realloc实现
先前我们的通讯录就是使用的顺序表实现的.
练习题
3.1 原地移除元素:https://leetcode-cn.com/problems/remove-element/
int removeElement(int* nums, int numsSize, int val)
{
int src = 0;
int dst = 0;
while (src < numsSize)
{
if (nums[src] == val)
{
src++;
}
else
{
nums[dst++] = nums[src++];
}
}
return dst;
}
十分典型的双指针做法:
其实通过src寻找非val的数字并让后面的dst覆盖.
合并两个有序数组
3.2 合并两个有序数组:https://leetcode-cn.com/problems/merge-sorted-array/
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{
int end1 = m - 1;
int end2 = n - 1;
int end = m + n - 1;
while (end1 >= 0 && end2 >= 0)
{
if (nums2[end2] >= nums1[end1])
{
nums1[end] = nums2[end2];
end2--;
end--;
}
else
{
nums1[end] = nums1[end1];
end1--;
end--;
}
}
while (end2 >= 0)
{
nums1[end] = nums2[end2];
end2--;
end--;
}
}
通过从后往前的比较将较大的数覆盖到nums1数组中.