07 快速幂和链表

一、快速幂

快速幂即是如何快速求解底数的n次幂的过程

快速幂算法的核心思想就是每一步都把指数分成两半,而相应的底数做平方运算。这样不仅能把非常大的指数给不断变小,所需要执行的循环次数也变小,而最后表示的结果却一直不会变。

1.传统解法

int ksm1(int x,int n)
{
     if(x==0||n<=0) return 0;
     int ans=1;
     while(n)
     {
       if(n%2==0)
       {
        n/=2;
        x*=x;
       }
       else
       {
        ans*=x;
        n--;
       }
     }
     return ans;
}

2.位运算解法

        这里值得说明的是,直接让n与1做位运算,如果得到的1,说明该位置为1,即对应的二进制位是1,直接乘即可,x=x^2,然后n向右整体偏移一位,重复比较。

int ksm2(int x,int n)
{
    if(x==0||n<=0) return 0;
    int ans=1;
    while(n)
    {
       if(n&1==1)
       {
            ans*=x;
       }
       n>>=1;
       x*=x;
    }
    return ans;
}

二、链表

1.链表的一些知识

  1. 链表是一种物理存储结构上非连续 、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。
  2. 节点类型是结构体,结构体包含数据域和指针域,数据域用来存放节点保存的数据,指针域保存下一个节点的地址。
  3. 存储空间可以不连续,可以在符合基本规则的情况下随意增删节点。
  4. 链表只有头增头删是O(1),别的位置进行增删都是O(n),虽然增删比较方便 但是其实都需要遍历。尾插能维持数据的原本顺序,头插会与原来的顺序相反。
  5. 头插法:优点:在不是空表的情况下,插入结点不需要从头到尾查找直到找到尾结点,效率较高
                  缺点:插入的顺序相反
  6. 尾插法:优点:插人的顺序相同
                   缺点:在不是空表的情况下,插人结点需要从头到尾查找直到找到尾结点,效率低

2.链表的创建

List * CreateList()
{
     List * pHead = NULL;
     List * pTail = NULL;
     int len;
     int num;
     printf("请输入链表的长度\n");
     scanf("%d",&len);
     List * pTemp =NULL;
     while(len)
     {
          printf("请输入数据:\n");
          scanf("%d",&num);
          //malloc的类型是void*
          pTemp = (List*)malloc(sizeof(List));//一次一个大小就行
          pTemp->data=num;
          pTemp->next=NULL;
          //空链表
          if(pHead==NULL)
          {
               pHead = pTemp;
               pTail = pTemp;
          }else
          {
               pTail->next=pTemp;
          }
          pTail = pTemp;
          len--;       
     }
     return pHead;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值