链表的链接:

将第二条链表的所有内容链接到第一条链表之后, 其完整实现代码与解析如下:

//链表的链接
template <typename Type>
void MyList<Type>::concatenate(const MyList<Type> &list)
{if (isEmpty())//如果自己的链表为空{first = list.first;return ;}else if (list.isEmpty())    //如果第二条链表为空{return ;}Node<Type> *endNode = first->next;//找到第一条链表的末尾节点while (endNode->next != NULL){endNode = endNode->next;}//找到第二条链表的第一个真实元素Node<Type> *secondListNode = (list.first)->next;//注意: 需要将第二个链表中的元素值copy出来//不能直接将第二条链表的表头链接到第一条链表的表尾//不然在析构函数回收内存时会发生错误(即:同一段内存释放两次)while (secondListNode != NULL){Node<Type> *newNode = new Node<Type>(secondListNode->data);newNode->next = NULL;endNode->next = newNode;//两条链表同时前进endNode = endNode->next;secondListNode = secondListNode->next;}
}

链表的反转:

基本思想:

遍历一遍链表,利用一个辅助指针(此处为指针r),存储遍历过程中当前指针指向的下一个元素,然后将当前节点元素的指针反转后,利用已经存储的指针往后面继续遍历。

//链表的反转
template <typename Type>
void MyList<Type>::invort()
{if (!isEmpty()){//p指向正向链表的第一个真实节点//随后, p也会沿正方向遍历到链表末尾Node<Type> *p = first->next;//q会成为倒向的第一个真实节点//首先将q设置为NULL: 保证反向之后//最后一个元素的指针域指向NULL, 以表示链表结束Node<Type> *q = NULL;while (p != NULL){Node<Type> *r = q;  //暂存q当前指向的节点//q后退(沿着正向后退)q = p;//p前进(沿着正向前进), 保证p能够始终领先q一个位置p = p -> next;//将指针逆向反转//注意:一点要保证这条语句在p指针移动之后运行,//不然p就走不了了...(因为q改变了指针的朝向)q -> next = r;}//此时q成为反向链表的第一个真实元素//但是为了维护像以前一样的first指针指向一个无用的节点(以使前面的操作不会出错)//于是我们需要将first的指针域指向qfirst->next = q;}
}

链表打印:

重载MyList的<<运算符, 输出链表所有元素, 以供测试之用

//显示链表中的所有数据(测试用)
template <typename Type>
ostream &operator<<(ostream &os, const MyList<Type> &list)
{for (Node<Type> *searchNode = list.first -> next;searchNode != NULL;searchNode = searchNode -> next){os << searchNode -> data;if (searchNode -> next != NULL) //尚未达到链表的结尾cout << " -> ";}return os;
}

附-测试代码:

int main()
{cout << "------------ 1 ------------" << endl;MyList<int> first;for (int i = 0; i < 5; ++i){first.insert(i+1, i+1);}first.remove(5);MyList<int> second;for (int i = 0; i < 5; ++i){second.insert(i+6, i+1);}second.insertFront(5);second.insert(88, 7);cout << "Before concatenate..." << endl;cout << "first: " << first << endl;cout << "second: " << second << endl;cout << "After concatenate..." << endl;first.concatenate(second);cout << "first: " << first << endl;cout << "second: " << second << endl;cout << "\n------------ 2 ------------" << endl;MyList<char> chList;for (char ch = '0'; ch <= '9'; ++ ch){chList.insertFront(ch);}cout << "Before invort..." << endl;cout << chList << endl;cout << "After invort..." << endl;chList.invort();cout << chList << endl;cout << "After remove('5')..." << endl;chList.remove('5');cout << chList << endl;cout << "\n------------ 3 ------------" << endl;MyList<double> dList;dList.insert(1.1, 1);dList.insertFront(2.2);cout << dList << endl;return 0;
}

数据结构基础(9) --单链表的设计与实现(2)之高级操作相关推荐

  1. 数据结构基础(8) --单链表的设计与实现(1)之基本操作

    链表简介 数组的缺点: 1.元素插入:除了在数组的末尾插入元素之外,在数组的其他任何位置插入元素都需要进行数组元素的频繁移动(插入位置之后的元素都需往后移动), 时间复杂度约为O(N); 2.数组的删 ...

  2. python数据结构基础(单链表,多链表,二叉树)

    python数据结构基础(单链表,多链表,二叉树) 数据结构指数据对象中数据元素之间的关系 Python 给我们提供了很多现成的数据结构类型,这些系统自己定义好的,不需要我们自己去定义的数据结构叫做 ...

  3. 数据结构基础(10) --单链表迭代器的设计与实现

    为了向 STL 致敬(O(∩_∩)O~), 我们模仿STL中的list的迭代器, 我们也自己实现一个MyList的迭代器, 以供遍历整个链表的所有元素: 首先:Node节点需要做如下修改(注意后缀有+ ...

  4. c语言递增20,2020-07-20(C语言)数据结构-在一个递增有序的线性表中,有数值相同的元素存在。若存储方式为单链表,设计算法去掉数值相同的元素,使表中不再有重复的元素...

    //在一个递增有序的线性表中,有数值相同的元素存在.若存储方式为单链表,设计算法去掉数值相同的元素,使表中不再有重复的元素,例如:(7,10,10,21,30,42,42,51,70)将变为(7,10 ...

  5. 数据结构精讲——单链表

    新手必会数据结构精讲--单链表 链表的介绍 概念:链表是一种物理存储结构上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 . 实际中链表的结构非常多样,以下情况组合起来就 ...

  6. [数据结构与算法] 单链表的简单demo

    Vc6之下编译通过.. 1 /******************************************************* 2 * @: Project: 单链表数据结构演示 3 * ...

  7. 数据结构与算法--单链表相关面试题

    此文章仅作为自己学习过程中的记录和总结,同时会有意地去用英文来做笔记,一些术语的英译不太准确,内容如有错漏也请多指教,谢谢! 一.概述 获取单链表的有效元素个数[新浪面试题1] 获取单链表倒数第k个结 ...

  8. 在一个递增有序的线性表中,有数值相同的元素存在。若存储方式为单链表,设计算法,去掉数值相同的元素,使得表中不再有重复的元素。

    在一个递增有序的线性表中,有数值相同的元素存在.若存储方式为单链表,设计算法,去掉数值相同的元素,使得表中不再有重复的元素.例如(7,10,10,21,30,42,42,42,51,70)将变为(7, ...

  9. 数据结构之——《单链表》

    数据结构之--<单链表> 1.链表概念 2.链表分类 3.接口函数实现 1.链表概念 链表是一种物理存储结构上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现. ...

最新文章

  1. Puppet Host资源介绍(二十一)
  2. 一个项目中能提出哪些数据库优化_如何有效进行项目集管理?
  3. POJ 1061 BZOJ 1477 Luogu P1516 青蛙的约会 (扩展欧几里得算法)
  4. Boost CRC的测试程序
  5. 搭配对比学习,万能的 prompt 还能做可控文本生成
  6. android开发之后端云bmob的使用
  7. 数据结构与算法之栈的用法
  8. 陈天奇的tvm更新了:VTA,开源AI芯片栈
  9. 视频教程-射频工程师工作指南-无线通信
  10. ES6重要知识点总结
  11. 记一下怎样关闭windows defender安全中心
  12. 台式电脑怎么调分辨率_电脑屏幕分辨率调节方法
  13. 面试总结-拉开2014校招的序幕
  14. 信息收集--子域名查询
  15. 计算机高级语言的优点,计算机语言|机器、汇编、高级语言联系及优缺点
  16. 计算机视觉最全专栏教程总结
  17. python评价指标_[Python人工智能] 六.神经网络的评价指标、特征标准化和特征选择...
  18. 时间管理黄金法则分享,让职场的你受益一生
  19. JS - Jquery 利用cookie 实现本地收藏功能,不重复无需多次命名
  20. 春招进行时,当代大学生求职行为大赏

热门文章

  1. 计算两个矩阵相乘(Java)
  2. Linux安装python3.7(Centos、Ubuntu)
  3. ROS报错:/usr/include/eigen3/Eigen/src/Core/util/StaticAssert.h:119:9: error: ‘YOU_MIXED_DIFFERENT
  4. python3 判断大小端的一种方法
  5. NumPy 基础用法
  6. 前端开发之模块化初探
  7. JSP 页面 jstl 时间戳 long型转时间
  8. #includeunistd.h存在linux中,含有系统服务的函数
  9. linux 开发异常错误记录
  10. 程序员心声:我为什么偏爱苹果电脑和Mac OS X