单链表的合并
Link Hebing(Link Ahead,Link Bhead)
{
Link Chead;
Node *p,*q,*r;
p=Ahead->next;
q=Bhead->next;
r=Chead=Ahead;
while(p&&q)
{
if(p->data <= q->data)
{
r->next=p;
r=p;
p=p->next;
}
else
{
r->next=q;
r=q;
q=q->next;
}
}
if(p) {
r->next=p;
}
if(q) {
r->next=q;
}
free(Bhead);
return Chead;
}
//合并链表
链表逆置①(有头结点)
void Nizhi(Link head)//队首队尾全体置换
{
Node *p,*q;
p=head->next;//找到首节点(第一个人)
head->next=NULL;//第一个人叫出来
while(p)//遍历该队
{
q=p;//给队伍换名(位置顺序改变不是原来队伍)
p=p->next;//指向第二个人
q->next=head->next;//第二个人(队伍发生变化就换名)走到空前边的位置
head->next=q;//第一个人去第二个位
}
}
转置链表,原理和头插法一致
例
1 2 3 做置换
1 口 2 3
2 口 1 3
1 口 3 2
3 口 2 1
无头结点的链表逆置②
借助空节点 r 完成对链表的逆置
Link Reverse(Link head) {
Node *p = head, *q, *r;
q = r = NULL;
while(p) {
q = p->next; //q保存下一个节点指针
p->next = r; //p指向r
r = p;
p = q;
}
return r;
}
链表循环
void Createshuang(Link head)
{
Node *p,*q;
p=head;
char name[20];
int num;
while(1)
{
scanf("%s",name);
scanf("%d",&num);
if(num==0)
break;
q=(Node*)malloc(sizeof(Node));
strcpy(q->name,name);
q->num=num;
p->next=q;
p=q;
} //循环链表的创建绝大部分和单向链表的尾插法创建一样;
p->next==head;//只有最后双向链表尾巴指向头结点,但是单向链表尾巴指向空
}
//循环链表的创建绝大部分和单向链表的尾插法创建一样;
//只有最后双向链表尾巴指向头结点,但是单向链表尾巴指向空
如果作者思路对您有用的话,麻烦点个赞支持喔!
循环判断
bool Xunhuan(Link head) {
Node *fast = head, *slow = head;
while(fast && fast->next ) {
fast = fast->next->next;
slow = slow->next;
if(fast == slow) {
return true;
}
}
return false;
}