尾指针表示
使用指向终端结点的尾指针来表示循环链表
特点是无须增加存储量,仅对链接方式稍作改变,即可使得表处理更加方便灵活
实现循环链表相连
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;
}
}