诙谐版——单链表的合并√,逆置√,循环链表及判断√

单链表的合并

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值