题目一:206反转链表
题目要求:
思路分析:
代码实现:
struct ListNode* reverseList(struct ListNode* head){
//n1,n2反转指针 n3链接下一个结点的指针struct ListNode* n1,*n2,*n3;n1 = NULL;n2 = head;if(n2)//有可能head本身就是空指针n3 = n2->next;while(n2)//结束条件:n2==NULL{n2->next = n1;//反转链表n1 = n2;n2 = n3;if(n3)//坑2:n3到NULL之后要停止,因为不存在NULL->nextn3 = n3->next;}return n1;
}
题目二:27.移除元素
题目要求:
思路分析:
代码实现:
int removeElement(int* nums, int numsSize, int val){int src = 0,dest = 0;while(src < numsSize){//等于val,src++,相当于删除//不等于val,把src位置的值覆盖到dest位置,src++,dest++if(nums[src] != val){nums[dest++]=nums[src++];// dest++;// src++:}else{src++;}}return dest;
}
题目三:删除有序数组中的重复项
题目要求:
思路分析:
代码实现:
int removeDuplicates(int* nums, int numsSize){int src = 0;int dest = 0;while(src < numsSize){//相等src++if(nums[src] == nums[dest]){src++;}//不等-->将src赋给dest的下一个,src++,dest++else{nums[++dest] = nums[src++];}}return dest+1;
}
题目四:88.合并两个有序数组
题目要求:
思路分析:
代码实现:
//方法1
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {int end1 = m - 1;//nums1末位int end2 = n - 1;//nums2末位int end = m + n - 1;//整个数组的末位while (end1 >= 0 && end2 >= 0)//循环条件:两个都没有结束{//倒着插入,取大的覆盖if (nums1[end1] > nums2[end2]){nums1[end--] = nums1[end1--];}else{nums1[end--] = nums2[end2--];}}//nums2有剩余,把剩余元素赋给nums1while (end2 >= 0){nums1[end--] = nums2[end2--];}}//方法2
int cmp_int(const void* ptr1, const void* ptr2)
{return (*(int*)ptr1 - *(int*)ptr2);
}
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {//第二种方法:存到一起,再利用qsort函数//直接强行合并两个数组int i = m;int j = 0;while (j < n){nums1[i] = nums2[j];j++;i++;}//利用qsort函数排序qsort(nums1, m + n, 4, cmp_int);
}
总结:
1.一个思路“双指针法”,即利用移动指针(src)和目标指针(dest),来完成对数组元素的操作,大家可以多多画图去理解这个过程;
2.“三指针法”求反转链表,两个指针进行反转,一个指针保证链表的“连接性”