• 链表


    不支持随机访问,相比数组占用额外的空间,适合有大量插入和删除,无访问要求的操作。

     1.链表生成:头插和尾插

    typedef struct node{
      int val;
      struct node* next;
    }Node,*pNode;
    
    int a[]={1,2,3,4,5};
    pNode phead = (pNode)calloc(sizeof(Node),0);
    phead->val = 0;
    Phead->next = NULL;
    pNode pcur = phead;
    for(int i = 0;i < 5;++i)
    {
      pNode p = (pNode)calloc(sizeof(Node),0);
      p->val = a[i];
      pcur->next = p;
      pcur = pcur->next;
    }

    2.链表倒转

    void reverse (pNode head)
    {
      pNode pReversedH = head;
      pNode pcur = head;
      pNode ppre = NULL;
      while(pcur)
      {
        pNode pnext = pcur->next;
        if(!pnext)
        {
              pReversedH = pcur;
         }
         pcur->next = ppre;
         ppre = pcur;
         pcur = pnext; 
      } 
    }                   
            

    3.查找链表的中间节点(快慢指针)

    void midval(pNode p)
    {    
        if(!p)
            return ;
        pNode fast=p,slow = p;
        while(fast)
        {
            if(fast->next)
                fast = fast->next->next;
            else 
                break;
            slow = slow->next;
         }
         pNode mid = slow;      
    }

     4.查找倒数第k个指针

    用两个指针,第一个先指向头指针向后偏移k的位置,第二个指针指向头指针,然后两个指针同时向后移动以为,直到第一个指针到末尾,则此时第二个指针就是结果。

    5.判断链表是否有环,有环的话求入口(也是通过快慢指针,如果有环这两指针最终会相等)

    求环入口:画图计算可得,相遇点到入口的距离刚好等于起点到入口的距离。

     6.判断两个链表是否交叉,就判断他们的尾结点是否相同,如果相同则有交点。

    求交点,先遍历两链表,得出长度a,b。然后较长的链表从表头偏移|a-b|,然后两链表向后依次移动一位,第一个相同的点则是交点。

  • 相关阅读:
    KlayGE 4.0功能规划
    Kinect for Windows SDK发布
    CENTOS下用syslogng集中管理日志并压缩保存
    Eclipse+Plugin
    struts2 获取request、session的方法
    ActiveMQ使用经验
    springmock + dbutil 用来测试数据库操作
    英语学习
    如何查看eclipse版本
    jQuery插件的开发
  • 原文地址:https://www.cnblogs.com/wukuaiqian/p/7802322.html
Copyright © 2020-2023  润新知