循环单向链表-合并算法

基础知识

循环链表是单链表的另一种形式,它是一个首尾相接的链表,其特点是将单链表最后一个结点的指针域由NULL改为指向头结点或线性表中的第一个结点,就得到了单链形式的循环链表,并称为循环单链表。

循环链表的图解

        

合并思路

        先找到两个链表的尾,并分别由指针p、q指向他们,然后将第一个链表的尾与第二个链表的第一个结点链接起来,并修改第二个表的尾Q,使它的链域指向第一个表的头结点。

        注意:链表合并后,需记得释放被合并链表的头结点。      

代码实现

#include <stdio.h>
#include <stdlib.h>

typedef struct Node {
	int data;
	struct Node * next;
} Node, *LinkList;

void initLink(LinkList *link);
void create(LinkList link, int start);
void fusion(LinkList linkA, LinkList linkB);
int main(int argc, char *argv[]) {
	LinkList LinkA, LinkB;
	initLink(&LinkA);
	initLink(&LinkB);
	create(LinkA, 1);
	create(LinkB, 10);
	fusion(LinkA, LinkB);
	Node *p;
	p = LinkA->next;
	while (p != LinkA) {
		printf("%d\n", p->data);
		p = p->next;
	}
	return 0;
}
/**
 * 初始化链表
 */
void initLink(LinkList *link) {
	*link = (LinkList)malloc(sizeof(Node));
	(*link)->next = NULL;
}

/**
 * 创建循环链表
 */
void create(LinkList link, int start) {
	Node *node, *q;
	q = link;
	int i;
	for (i = start; i < start + 5; i++) {
		node = (Node *)malloc(sizeof(Node));
		node->data = i;
		link->next = node;
		link = node;
	}
	link->next = q;
}

/***
 * 合并循环链表 
 */
void fusion(LinkList linkA, LinkList linkB) {
	Node *p, *q;
	p = linkA->next;
	q = linkB->next;
	while (p->next != linkA) {
		p = p->next;
	}
	while (q->next != linkB) {
		q = q->next;
	}
	p->next  = linkB->next;
	q->next = linkA;
	/*释放LinkB的头结点*/ 
	free(linkB);
}

转载于:https://my.oschina.net/niithub/blog/3018316

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值