📜  双指针 in - C 编程语言(1)

📅  最后修改于: 2023-12-03 15:37:05.434000             🧑  作者: Mango

双指针 in - C 编程语言

在C编程语言中,双指针技术是一个非常有用的编程技术。双指针主要有两个指针变量,它们分别指向同一个数组或链表中的两个不同位置,通过移动指向这些位置的指针来遍历或定位其中的数据。

优点

使用双指针技术,能够避免循环嵌套及其他问题,简化代码的逻辑清晰易读,而且其时间和空间效率也十分高。

示例

下面给出一个双指针的实现示例,用来比较两个已排序数组的交集:

#include <stdio.h>
#include <stdlib.h>

int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize) {
    int i = 0, j = 0, k = 0, *res = (int*)malloc((nums1Size > nums2Size ? nums2Size : nums1Size) * sizeof(int)); // 新建数组
    
    while(i < nums1Size && j < nums2Size) { //当i和j小于各自的数组大小时
        if(nums1[i] == nums2[j]) {
            res[k++] = nums1[i]; // 记录下这个数据,并将res指针后移
            i++, j++; 
        } else if(nums1[i] < nums2[j]) { // 当num1的值小于num2的值时i指针加1
            i++;
        } else { // 当num1的值大于num2的值时j指针加1
            j++;
        }
    } 
    
    *returnSize = k; // 将k值赋值给res指针所指向的内存空间
    
    return res;
}

int main() {
    int nums1[] = {1,2,2,1};
    int nums2[] = {2,2};

    int n1 = sizeof(nums1) / sizeof(nums1[0]);
    int n2 = sizeof(nums2) / sizeof(nums2[0]);

    int returnSize;
    int* res = intersection(nums1, n1, nums2, n2, &returnSize);

    printf("[");
    for(int i = 0; i < returnSize; i++) {
        printf("%d", res[i]);
        if(i != (returnSize - 1)) {
            printf(",");
        }
    }
    printf("]\n");
    return 0;
}

如上示例,我们创建两个指针i和j,它们分别指向数组nums1和nums2的第一个元素,然后,我们在while循环中比较这两个指针所指向的元素,如果它们相等,则记录下这个元素,并将指向这些元素的指针向后移动,遍历完数组后,输出交集数组。

总结

虽然双指针技术十分有用,但它也存在一些问题。如,需要在代码中手动管理指针取值及其它内存操作,以防止出现空指针、越界等问题。同时,需要注意在每次变量前声明及初始化这些变量,否则可能会出现意想不到的结果。