首页 > 其他分享 >两个单向循环链表的合并(带头结点)

两个单向循环链表的合并(带头结点)

时间:2023-02-13 11:36:29浏览次数:50  
标签:pb 结点 LB LA LSNode 单向 head next 链表

两个单向循环链表的合并(带头结点)

问题引入:

已知两个带头结点的单向循环链表,LA和LB分别是链表的头指针,LA=(a1,a2…am),LB=(b1,b2,…bm),编写算法,将LA和LB合并成一个单项循环链表LC=(a1,a2…am,b1,b2,…bm)。

核心算法:

只需要修改两个表的表尾结点让两个表连起来即可。最后释放多余的LB这个头结点

typedef struct node {
	DataType data;
	struct node *next;
}*LSNode;
//两个带头结点的单向循环链表合并
LSNode merge(LSNode LA, LSNode LB) {
	LSNode pa = LA,LC=LA;
	LSNode pb = LB;
	while (pa->next != LA) {//让p指向LA表尾
		pa=pa->next;
	}
	while (pb->next != LB) {//让p指向LB表尾
		pb = pb->next;
	}
	pa->next = LB->next;
	pb->next = LC;
	free(LB);
	return LC;

}

完整测试(VS2017)

List.h

#pragma once
typedef struct node {
	DataType data;
	struct node *next;
}*LSNode;
//初始化
void Initiate(LSNode *head) {
	(*head) = (LSNode)malloc(sizeof(struct node));
	(*head)->next = (*head);
}
//插入函数
bool Insert(LSNode head,int i, DataType data) {
	int j = -1;
	LSNode p = head,q;
	while (p->next != head && j < i - 1)//最终p指向第j-1个结点
	{
		p = p->next;
		j++;
	}
	if (j != i - 1)
	{
		printf("插入位置出错!");
		return false;
	}
	q = (LSNode)malloc(sizeof(struct node));
	q->data = data;
	q->next = p->next;
	p->next = q;
	return 1;
}
//遍历链表
void print(LSNode head)
{
	LSNode p = head;
	while (p->next != head) {
		p = p->next;
		printf("%d ", p->data);
	}
	printf("\n");
}
//两个带头结点的循环单链表合并
LSNode merge(LSNode LA, LSNode LB) {
	LSNode pa = LA,LC=LA;
	LSNode pb = LB;
	while (pa->next != LA) {//让p指向LA表尾
		pa=pa->next;
	}
	while (pb->next != LB) {//让p指向LB表尾
		pb = pb->next;
	}
	pa->next = LB->next;
	pb->next = LC;
	free(LB);
	return LC;

}

源.cpp

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef int DataType;
#include"List.h"
int main() {
	LSNode head,head1,head2;
	Initiate(&head);
	Initiate(&head1);
	Initiate(&head2);
	for (int i = 0; i < 10; i++) {
		Insert(head, i, i + 1);
		Insert(head1, i, i + 11);
	}
	print(head);
	print(head1);
	//执行两个单项循环链表的合并
	printf("执行两个带头结点单项循环链表的合并:\n");
	head2 = merge(head, head1);
	print(head2);
	return 0;
}

测试结果:

两个单向循环链表的合并(带头结点)_指针

标签:pb,结点,LB,LA,LSNode,单向,head,next,链表
From: https://blog.51cto.com/u_15961549/6053824

相关文章

  • 两个非递增的有序链表的合并
    两个非递增的有序顺序表的合并一、问题引入:已知两个带头结点的非递增有序的单链表A和B,设计算法将两个单链表合并成一个非递增有序的单链表C.要求单链表C仍使用原来......
  • 求二叉树中度为1的结点个数
    一、问题引入已知一颗以二叉链表方式存储的二叉树,编写算法计算二叉树的单孩子的结点数。单孩子是指该结点只有左孩子或只有右孩子(其实就是求度为1的结点个数)二、......
  • 蓝桥杯链表总结(3)
    力扣链表相关题目反转链表题目:给你单链表的头节点head,请你反转链表,并返回反转后的链表。示例1:输入:head=[1,2,3,4,5]输出:[5,4,3,2,1]示例2:输入:head=[1,2]......
  • java: 小王子单链表 ------ ( LinkedList )
    java.util包中的LinkedList<E>泛型类创建的对象以链表结构存储数据,习惯上称LinkedList类创建的对象为链表对象。LinkedList<String>myList=newLinkedList<String>(......
  • LeetCode算法题二——合并两个有序链表
    题目给你一个非空整数数组nums,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。你必须设计并实现线性时间复杂度的算法来解决此问......
  • 算法刷题-插入区间、杨辉三角、移除链表元素
    插入区间给你一个无重叠的,按照区间起始端点排序的区间列表。在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。示例1:输入......
  • 环形链表I、II(含代码以及证明)
    环形链表解题思路定义两个指针,一个快指针,一个慢指针,快指针每次移动两个节点,慢指针每次移动一个节点。从头节点开始,让快慢指针同时移动,如果链表中有环,那么快慢指针一定......
  • C语言学习:案例:单链表的基本实现
     1#include<io_utils.h>2#include<stdlib.h>34typedefstructListNode{5intvalue;6structListNode*next;7}ListNode;89......
  • LinuxKernel 入侵式双向链表的设计,分析,使用
    PS:要转载请注明出处,本人版权所有。PS:这个只是基于《我自己》的理解,如果和你的原则及想法相冲突,请谅解,勿喷。前置说明  本文作为本人csdnblog的主站的备份。(BlogID......
  • 数据结构29-链表_认识链表结构1
     ......