双指针算法

双指针算法是通过设置两个指针进行单向移动对链表进行遍历的一种算法,主要的方法有——快慢指针、左右指针。

(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;
}

 双指针法中,快慢指针通常来说更常用一些。

(水平比较菜,纯练手,如有错误及不足之处忘轻喷)

  • 11
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值