合并两个链表,两个表的元素交叉进行,合并之后合并后的链表变成空表
来源:互联网 发布:鲁滨逊漂流记java 编辑:程序博客网 时间:2024/05/17 17:59
//编写方法meld,合并之后的两个表变成空表
template<typename T>
void chain<T>::meld(chain<T>& a, chain<T>& b)
{
chainNode<T>*pa = a.firstNode;
chainNode<T>*pb = b.firstNode;
int aS = a.size();
int bS = b.size();
firstNode = new chainNode<T>(pa->element); //先把a的首位元素赋给完成合并的表
chainNode<T>*targetNode = firstNode;
chainNode<T>*deleteNode;
deleteNode = pa;
pa = pa->next;
a.firstNode = pa;
++listSize;
delete deleteNode;
if (aS <= bS) //有两种情况,a的长度小于等于b的长度,还有大于的情况
{
while (pa!=NULL) //先把a的所有元素放在表的偶数位,奇数位是b的元素
{
targetNode->next = new chainNode<T>(pb->element);
deleteNode = pb;
targetNode = targetNode->next;
pb = pb->next;
b.firstNode = pb;
++listSize;
delete deleteNode;
targetNode->next = new chainNode<T>(pa->element);
deleteNode = pa;
targetNode = targetNode->next;
pa = pa->next;
a.firstNode = pa;
++listSize;
delete deleteNode;
}
while (pb!=NULL) //把b的剩余元素赋给完成合并的表
{
targetNode->next = new chainNode<T>(pb->element);
deleteNode = pb;
targetNode = targetNode->next;
pb = pb->next;
b.firstNode = pb;
delete deleteNode;
++listSize;
}
targetNode->next = NULL;
}
else //a的长度大于b的情况
{
while (pb != NULL)
{
targetNode->next = new chainNode<T>(pb->element);
deleteNode = pb;
targetNode = targetNode->next;
pb = pb->next;
b.firstNode = pb;
++listSize;
delete deleteNode;
targetNode->next = new chainNode<T>(pa->element);
deleteNode = pa;
targetNode = targetNode->next;
pa = pa->next;
a.firstNode = pa;
++listSize;
delete deleteNode;
}
while (pa != NULL)
{
targetNode->next = new chainNode<T>(pa->element);
deleteNode = pa;
targetNode = targetNode->next;
pa = pa->next;
a.firstNode = pa;
delete deleteNode;
++listSize;
}
targetNode->next = pa;
}
}
template<typename T>
void chain<T>::meld(chain<T>& a, chain<T>& b)
{
chainNode<T>*pa = a.firstNode;
chainNode<T>*pb = b.firstNode;
int aS = a.size();
int bS = b.size();
firstNode = new chainNode<T>(pa->element); //先把a的首位元素赋给完成合并的表
chainNode<T>*targetNode = firstNode;
chainNode<T>*deleteNode;
deleteNode = pa;
pa = pa->next;
a.firstNode = pa;
++listSize;
delete deleteNode;
if (aS <= bS) //有两种情况,a的长度小于等于b的长度,还有大于的情况
{
while (pa!=NULL) //先把a的所有元素放在表的偶数位,奇数位是b的元素
{
targetNode->next = new chainNode<T>(pb->element);
deleteNode = pb;
targetNode = targetNode->next;
pb = pb->next;
b.firstNode = pb;
++listSize;
delete deleteNode;
targetNode->next = new chainNode<T>(pa->element);
deleteNode = pa;
targetNode = targetNode->next;
pa = pa->next;
a.firstNode = pa;
++listSize;
delete deleteNode;
}
while (pb!=NULL) //把b的剩余元素赋给完成合并的表
{
targetNode->next = new chainNode<T>(pb->element);
deleteNode = pb;
targetNode = targetNode->next;
pb = pb->next;
b.firstNode = pb;
delete deleteNode;
++listSize;
}
targetNode->next = NULL;
}
else //a的长度大于b的情况
{
while (pb != NULL)
{
targetNode->next = new chainNode<T>(pb->element);
deleteNode = pb;
targetNode = targetNode->next;
pb = pb->next;
b.firstNode = pb;
++listSize;
delete deleteNode;
targetNode->next = new chainNode<T>(pa->element);
deleteNode = pa;
targetNode = targetNode->next;
pa = pa->next;
a.firstNode = pa;
++listSize;
delete deleteNode;
}
while (pa != NULL)
{
targetNode->next = new chainNode<T>(pa->element);
deleteNode = pa;
targetNode = targetNode->next;
pa = pa->next;
a.firstNode = pa;
delete deleteNode;
++listSize;
}
targetNode->next = pa;
}
}
阅读全文
0 0
- 合并两个链表,两个表的元素交叉进行,合并之后合并后的链表变成空表
- 合并两个排序后的链表
- 两个链表的合并
- 两个链表的合并
- 5,两个不交叉的有序链表的合并
- 5两个不交叉的有序链表的合并
- 合并两个有序的链表(非交叉)
- 两个链表初始化之后合并
- 合并两个链表
- 合并两个链表
- 合并两个链表
- 合并两个链表
- 合并两个链表
- 合并两个链表
- 合并两个有序链表,合并后依然有序
- 合并两个链表,去掉重复元素
- C++实现两个已经排序的链表进行合并
- C++实现两个已经排序的链表进行合并
- 尝试用es6封装方法
- Spring MVC——基础(简介,使用,地址映射)
- 【Leetcode-Medium-46】Permutations
- Two Sum
- The C Programming Language 练习题4-5
- 合并两个链表,两个表的元素交叉进行,合并之后合并后的链表变成空表
- Numpy混淆点理解
- PullToRefresh
- php实现redis消息队列将数据保存到mysql
- 1039. 到底买不买(20)
- 【OpenCV】error C4996: 'fopen': This function or variable may be unsafe
- 安卓无线调试 react-native
- Java并发编程(自定义同步组件)
- NOIP模拟(10.19)T3 放盒子