zoukankan      html  css  js  c++  java
  • 单链表及简单应用

    单链表

    基本结构
    struct node{
        ElemType data;
        node *next;
    };
    
    快慢指针及其应用
    (1) 判断链表中是否有圈(亦称floyed判圈法)
    • ACM例题: Uva 11549

    原理:两个人跑步,A的速度大于B,如果跑道没有环,那么A永远是领先于B,如果有环,那么A必然会追上B.

    (2)寻找循环链表的入口

    设环周期为r,相遇点为x,起点到入口长度为a,计算可得

    A: a+x
    B: a+n*r+x
    因为:
       Vb=2Va
    所以:
          2(a+x)=a+n*r+x
    -->   a+x=n*r
    -->   a=n*r-x
    
    此时A回到远点重跑到入口处,Sa=a
    B从相遇点开始跑,Sb=x+a=n*r;
    n*r是环长的倍数,正好与A在入口处相遇
    
    
    node *s1=head;
    node *s2=head;
    while(s1!=s2){
       s1=s1->next;
       if(s2->next==null) break;
       s2=s2->next->next;
    }
    if(s2->next==null) return null;
    s1=head;
    while(s1!=s2){
        s1=s1->next;
        s2=s2->next;
    }
    return s2;
    
    (3)寻找倒数第k个节点

    两个指针保持同一速度,A指针走到k时B指针才走,那么当A指针走完整个指针时,B指针正好走到第倒数第k个节点

    (4)判断两个链表相交

    由于单链表的特殊性质,可知:若链表于某处相交,后面的节点都会保持一致,所以我们只需判断尾节点是否一致就可以(若两个链表都存在环,只要尾节点是环中一处即可)。

  • 相关阅读:
    [WC2011]最大XOR和路径 线性基
    线段树分裂合并
    [NOIp2016]天天爱跑步 线段树合并
    CF1111E Tree 树链剖分,DP
    [NOI2016]区间 线段树
    [IOI2018] werewolf 狼人 kruskal重构树,主席树
    [CQOI2012]组装 贪心
    [ONTAK2010]Peaks kruskal重构树,主席树
    [NOI2018]归程 kruskal重构树
    kruskal重构树
  • 原文地址:https://www.cnblogs.com/zsyacm666666/p/6898208.html
Copyright © 2011-2022 走看看