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

简介: 链表的链接:    将第二条链表的所有内容链接到第一条链表之后, 其完整实现代码与解析如下://链表的链接template void MyList::concatenate(cons...

链表的链接:

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

//链表的链接
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的指针域指向q
        first->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;
}


目录
相关文章
|
11月前
|
存储 算法 Perl
数据结构实验之链表
本实验旨在掌握线性表中元素的前驱、后续概念及链表的建立、插入、删除等算法,并分析时间复杂度,理解链表特点。实验内容包括循环链表应用(约瑟夫回环问题)、删除单链表中重复节点及双向循环链表的设计与实现。通过编程实践,加深对链表数据结构的理解和应用能力。
181 4
|
8月前
|
存储 机器学习/深度学习 算法
C 408—《数据结构》算法题基础篇—链表(下)
408考研——《数据结构》算法题基础篇之链表(下)。
207 30
|
8月前
|
存储 算法 C语言
C 408—《数据结构》算法题基础篇—链表(上)
408考研——《数据结构》算法题基础篇之链表(上)。
342 25
|
9月前
|
机器学习/深度学习 存储 C++
【C++数据结构——线性表】单链表的基本运算(头歌实践教学平台习题)【合集】
本内容介绍了单链表的基本运算任务,涵盖线性表的基本概念、初始化、销毁、判定是否为空表、求长度、输出、求元素值、按元素值查找、插入和删除数据元素等操作。通过C++代码示例详细解释了顺序表和链表的实现方法,并提供了测试说明、通 - **任务描述**:实现单链表的基本运算。 - **相关知识**:包括线性表的概念、初始化、销毁、判断空表、求长度、输出、求元素值、查找、插入和删除等操作。 - **测试说明**:平台会对你编写的代码进行测试,提供测试输入和预期输出。 - **通关代码**:给出了完整的C++代码实现。 - **测试结果**:展示了测试通过后的预期输出结果。 开始你的任务吧,祝你成功!
374 5
|
10月前
|
数据库
数据结构中二叉树,哈希表,顺序表,链表的比较补充
二叉搜索树,哈希表,顺序表,链表的特点的比较
数据结构中二叉树,哈希表,顺序表,链表的比较补充
|
11月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
301 5
|
12月前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
187 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
11月前
|
存储 C语言
【数据结构】手把手教你单链表(c语言)(附源码)
本文介绍了单链表的基本概念、结构定义及其实现方法。单链表是一种内存地址不连续但逻辑顺序连续的数据结构,每个节点包含数据域和指针域。文章详细讲解了单链表的常见操作,如头插、尾插、头删、尾删、查找、指定位置插入和删除等,并提供了完整的C语言代码示例。通过学习单链表,可以更好地理解数据结构的底层逻辑,提高编程能力。
924 4
|
11月前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之单双链表精题详解(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
11月前
|
存储 Web App开发 算法
2024重生之回溯数据结构与算法系列学习之单双链表【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构之单双链表按位、值查找;[前后]插入;删除指定节点;求表长、静态链表等代码及具体思路详解步骤;举例说明、注意点及常见报错问题所对应的解决方法

热门文章

最新文章