双指针算法是通过设置两个指针进行单向移动对链表进行遍历的一种算法,主要的方法有——快慢指针、左右指针。
(1)快慢指针:快慢指针多用于环形链表节点寻找,重复元素删除等问题,通过两个指针指向的值或存储指针上一个元素的地址,以便进行比较及删除元素等问题,例子如下:
struct ListNode* deleteNode(struct ListNode* head, int val){
if(head->val == val) { // 头节点为待删除的节点
return head->next;
}
struct ListNode* cur = head->next; // 当前节点
struct ListNode* pre = head; // 保存待删除节点的前一节点
while (cur&&pre) {
if(cur->val==val)
pre->next=cur->next;
cur=cur->next;
pre=pre->next;
}
return head;
}
(2) 左右指针:通常用于寻找两数之和的最值等左右对称的问题,一个指针从头开始,一个指针从为开始遍历,面对面移动,直到两指针相遇,遍历结束,例子如下:
int pairSum(struct ListNode* phead){
//struct ListNode* head;
struct ListNode* tail=phead;
int arr[100000];
int i = 0;
while(tail)
{
arr[i]=tail->val;//尾指针确定链表元素个数
tail=tail->next;
i++;
}
int j = 0;
int a=i-1;
int k,sum=0;
while(j<a)
{
k=arr[j]+arr[a];
if(k>sum)
sum=k;
j++;
a--;
}
return sum;
}
双指针法中,快慢指针通常来说更常用一些。
(水平比较菜,纯练手,如有错误及不足之处忘轻喷)