数据结构与算法笔记 lesson7 循环链表2

尾指针表示

使用指向终端结点的尾指针来表示循环链表
特点是无须增加存储量,仅对链接方式稍作改变,即可使得表处理更加方便灵活

实现循环链表相连

LinkList Connect (LinkList A , LinkList B)
{
   LikeList p = A -> next ;
   A -> next = B->next ->next ;
   free (B-next );
   B->next = p;
   return B;
} 

判断单链表是否有环

步数比记法
int  HasLoop (LinkList L)
{
   LinkList cur1 = L;
   int pos1 = 0; 
  while (cur1)
   {
         LinkList cur2 =L;
         int pos2 = 0 ;
         while (cur2)
         {
                if(cur2==cur1)
                {
                 if(pos1 == pos2)
                    break;
                }
                 else
                {
                     printf("%d",pos2);
                     return 1;
                }
                  cur2 = cur2->next;
                  pos2++;
          }
                  cur1 = cur1->next;
                  pos1++;
    }
   return 0;
}
快慢指针
int HasLoop(LinkList L)
{
     int step1 = 1;
     int step2 = 2;
     LinkList p = L ;
     LinkList q = L;
     while ( p! = NULL && q ! =NULL && q->next != NULL)
    {
        p=p->next ;
        if (q->next != NULL)
        q=q->next->next ;

        printf ("%d, %d\n" , p->data , q->data);
        if (p==q)
         return1 ;
    }    
  return 0;
}

魔术师发牌问题

    魔术师手中有A、2、3……J、Q、K十三张黑桃扑克牌。在表演魔术前,魔术师已经将他们按照一定的顺序叠放好(有花色的一面朝下)。魔术表演过程为:一开始,魔术师数1,然后把最上面的那张牌翻过来,是黑桃A;然后将其放到桌面上;第二次,魔术师数1、2;将第一张牌放到这些牌的最下面,将第二张牌翻转过来,正好是黑桃2;第三次,魔术师数1、2、3;将第1、2张牌依次放到这些牌的最下面,将第三张牌翻过来正好是黑桃3;……直到将所有的牌都翻出来为止。问原来牌的顺序是如何的
#define CardNum 13
typedef struct node
{
   int  data;
    struct node *next;
 }sqlist , *linklist;
linklist CreateLinkList()
{
   linklist head= NULL;
   linklist s,r;
   int i;
   r = head;
   for (i=1;i<CardNum;i++)
  {
    s=(linkList)malloc(sizeof(sqlist));
    s->data=0;
    if(head==NULL)
      head = s
    else
      r ->next= s;
  } 
    r->next = head;
    return head;
}
void Magician(linklist head)
{
     linklist p ; 
     int j ;
     int Countnumber =2;
     p = head;
     p->data =1;
     while(1)
   {   for(j=0;j<countnumber;j++)
         p=p->next;
      
     if(p->data ! = 0)
	  p->next;
           j-- ;
   }
      if(p->data==0)
     {
         p->data=CountNumber;
         CountNumber++;
         if(CountNumber == 14)
             break;
      }
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值