单链表及简单应用

单链表

基本结构
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)判断两个链表相交

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

原文地址:https://www.cnblogs.com/zsyacm666666/p/6898208.html