1、零移动(238双指针)

使用一个快指针一个慢指针,一个用来填充一个用来查找,最后补零
cpp
void moveZeroes(int* nums, int numsSize)
{
int slow = 0;
for(int fast = 0; fast < numsSize; fast ++)
{
if(nums[fast] != 0)
{
nums[slow++] = nums[fast];
}
}
for(int fast = slow; fast < numsSize; fast ++)
{
nums[fast] = 0;
}
}
2、翻转链表(206链表)

cpp
struct ListNode* reverseList(struct ListNode* head)
{
struct ListNode *temp1 = NULL;
struct ListNode *temp2 = head;
while(temp2 != NULL)
{
struct ListNode *temp3 = temp2 -> next;
temp2 -> next = temp1;
temp1 = temp2;
temp2 = temp3;
}
return temp1;
}
3、相交链表(160 双指针链表)

cpp
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
struct ListNode *pA = headA;
struct ListNode *pB = headB;
int Flag = 0;
while(pA != pB)
{
if(pB->next == NULL)
{
pB = headA;
Flag++;
}
else
{
pB = pB->next;
}
if(pA->next == NULL)
{
pA = headB;
Flag++;
}
else
{
pA = pA->next;
}
if(Flag > 2)return NULL;
}
return pA;
}
4、回文链表(234链表双指针)

cpp
bool isPalindrome(struct ListNode* head) {
//找中点(Fast走两步,Slow走一步)
if(head == NULL || head -> next == NULL) return true;
struct ListNode* pSlow = head;
struct ListNode* pFast = head;
while(pFast != NULL && pSlow != NULL)
{
pFast = pFast -> next;
//判断奇偶
if(pFast == NULL)
{
pSlow -> next;
break;
}
pFast = pFast -> next;
pSlow = pSlow -> next;
}
//翻转后边的链表
struct ListNode* temp1 = NULL;
struct ListNode* temp2 = pSlow;
while(temp2 != NULL)
{
struct ListNode* temp3 = temp2->next;
temp2 -> next = temp1;
temp1 = temp2;
temp2 = temp3;
}
//比较
pFast = head;
pSlow = temp1;
while(pSlow != NULL)
{
if(pFast -> val != pSlow -> val) return false;
pFast = pFast->next;
pSlow = pSlow->next;
}
return true;
}
5、环形列表(141链表双指针)

cpp
bool hasCycle(struct ListNode *head)
{
if (head == NULL || head->next == NULL) return false;
struct ListNode *pFast = head->next;
struct ListNode *pSlow = head;
while(pFast != pSlow)
{
if(pFast == NULL || pFast -> next == NULL)return false;
pFast = pFast -> next -> next;
pSlow = pSlow -> next;
}
return true;
}
6、盛最多水的容器(11数组双指针)

cpp
int maxArea(int* height, int heightSize) {
int pPre = 0;
int pBac = heightSize-1;
int maxArea = height[pPre] > height[pBac] ? height[pBac] * abs(pBac - pPre) : height[pPre] * abs(pBac - pPre);
int newArea = 0;
while(pBac > pPre)
{
//如果前面长后边短,后面就要找一根比前面长的
if(height[pPre] >= height[pBac])
{
int prehight = height[pBac];
while((prehight >= height[pBac]) && (pBac > pPre))
{
pBac--;
}
}
newArea = height[pPre] > height[pBac] ? height[pBac] * abs(pBac - pPre) : height[pPre] * abs(pBac - pPre);
maxArea = maxArea > newArea ? maxArea : newArea;
//反之
if(height[pPre] < height[pBac])
{
int prehight = height[pPre];
while((prehight >= height[pPre]) && (pBac > pPre))
{
pPre++;
}
}
newArea = height[pPre] > height[pBac] ? height[pBac] * abs(pBac - pPre) : height[pPre] * abs(pBac - pPre);
maxArea = maxArea > newArea ? maxArea : newArea;
}
return maxArea;
}