C++实现单链表

阅读先知

链表是一种动态数据结构,他的特点是用一组任意的存储单元(可以是连续的,也可以是不连续的)存放数据元素。

链表中每一个元素成为“结点”,每一个结点都是由数据域和指针域组成的,每个结点中的指针域指向下一个结点。Head是“头指针”,表示链表的开始,用来指向第一个结点,而最后一个指针的指针域为NULL(空地址),表示链表的结束。

可以看出链表结构必须利用指针才能实现,即一个结点中必须包含一个指针变量,用来存放下一个结点的地址。

结点中只有一个next指针的链表称为单链表,这是最简单的链表结构。

具体实现

  1. 首先定义一个结构体,表示链表的节点

    typedef struct Node
    {
    ElemType data;
    struct Node *next;
    }LinkList;
  2. 建立单链表类

    class Mylist
    {
    private:
    LinkList* L;
    public:
    //初始化一个带头结点的单链表
    bool InitList()
    {
    L = new LinkList;
    if (L==NULL)
    {
    cout << "Not have enough memory!";
    return false;
    }
    L->next = NULL;
    return true;
    }
    bool CreateNode(int size)
    {
    int i = 0;
    ElemType e;
    LinkList* p =L;
    cout << ">>>>please input "<<size<<" nodes with space to split:";
    while(i<size)
    {
    LinkList* q = new LinkList;
    cin >> e;
    q->data = e;
    q->next = NULL;
    p->next = q;
    p = q;
    i++;
    }
    return true;
    }
    void DispList()
    {
    LinkList* p = L->next;
    while (p!=NULL)
    {
    cout << p->data<<' ';
    p = p->next;
    }
    cout << endl;
    }
    int ListLength()
    {
    int i = 0;
    LinkList* p = L->next;
    while (p!=NULL)
    {
    ++i;
    p = p->next;
    }
    return i;
    }
    bool ListEmpty()
    {
    return L->next == NULL;
    }
    bool GetElem(int site,ElemType &e)
    {
    int i =0;
    LinkList* p = L;
    while (i<site && p!=NULL)
    {
    i++;
    p = p->next;
    }
    if (p == NULL || site == 0)
    return false;
    else
    {
    e = p->data;
    return true;
    }
    }
    bool LocateElem(int &site,ElemType e)
    {
    int i = 1;
    LinkList* p = L->next;
    while (p!= NULL && p->data!=e)
    {
    i++;
    p = p->next;
    }
    if (p==NULL)
    return false;
    else
    site = i;
    return true;
    }
    //插入元素
    bool ListInsert(int site,ElemType e)
    {
    int i = 0;
    LinkList* p = L->next;
    while (i < site && p!=NULL)
    {
    i++;
    p = p->next;
    }
    if (p == NULL)
    return false;
    else
    {
    LinkList* q = new LinkList;
    q->data = e;
    q->next = NULL;
    p->next = q;
    return true;
    }
    }
    //删除元素
    bool ListDelete( int site, ElemType &e )
    {
    int i = 0;
    LinkList* p = L;
    while ( i<site-1 && p!=NULL )
    {
    i++;
    p = p->next;
    }
    if ( NULL == p )
    return false;
    else
    {
    LinkList* q = p->next;
    if ( NULL == q )
    return false;
    e = q->data;
    p->next = q->next;
    delete q;
    return true;
    }
    }
    // (带头一起)销毁链表
    void DestoryList()
    {
    LinkList *p, *q;
    p = L;
    while ( p!=NULL )
    {
    q = p->next;
    delete p;
    p = q;
    }
    }
    };

    主函数代码

    int main()
    {
    Mylist h;
    ElemType e;
    int temp=0;
    h.InitList();
    cout << ">>>>please input the length of linklist:";
    cin >> temp;
    h.CreateNode(temp);
    cout <<"show:";
    h.DispList();
    cout <<"the length of linklist is:"<<h.ListLength()<<endl;
    cout <<"is it empty?"<<h.ListEmpty()<<endl;
    cout << ">>>>which element do you want to find:";
    cin >> temp;
    h.GetElem(temp,e);
    cout <<"this element is "<<e<<endl;
    cout << ">>>>Which element index do you want to find:";
    cin >> temp;
    h.LocateElem(temp,temp);
    cout <<"this element index is "<<temp<<endl;
    return 0;
    }

    拓展应用

_题目描述:_判断链表是否带环,以及环的入口

  • 有一个单链表,其中可能有一个环,也就是某个节点的next指向的是链表中在它之前的任意一个节点,这样在链表尾部形成一个环。

主要思想:

  • 如果判断一个链表是否存在一个环?设定两个指针slow,fast,均从头指针开始,每次分别前进1步、2步。如果存在环,则两者相遇;如不存在环,fast遇到NULL退出。
  • 如果链表存在环,如何找到环的入口点?当fast与slow相遇时,slow肯定没有遍历完链表或者恰好遍历一遍。于是我们从链表头与相遇点分别设一个指针,每次各走一步,两个指针必定相遇,则相遇的第一个点为环入口点。

数学解析:

代码部分:

    bool findloopport(ElemType &e)
{
LinkList* fast = L;
LinkList* slow = L;
while (fast && fast->next)
{
slow = slow->next;
fast = fast->next->next;
if (slow == fast)
break;
}
if (fast == NULL || fast->next == NULL)
return false;
slow = L;
while (slow != fast)
{
slow = slow->next;
fast = fast->next;
}
e = slow->data;
return true;
}

温馨提示:代码可以根据个人习惯编写,本文还有待补缺的地方。。。。

singlelinklist的更多相关文章

  1. JAVA 链表操作:单链表和双链表

    主要讲述几点: 一.链表的简介 二.链表实现原理和必要性 三.单链表示例 四.双链表示例 一.链表的简介 链表是一种比较常用的数据结构,链表虽然保存比较复杂,但是在查询时候比较便捷,在多种计算机语言都 ...

  2. 剑指offer—第三章高质量代码(o(1)时间删除链表节点)

    题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点,链表节点与函数的定义如下:struct ListNode{int m_nValue;ListNode* m_pValue ...

  3. python数据结构链表之单向链表

    单向链表 单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域.这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值. 表元素域ele ...

  4. python 单向链表实现

    单链表的操作 is_empty() 链表是否为空 length() 链表长度 travel() 遍历整个链表 add(item) 链表头部添加元素 append(item) 链表尾部添加元素 inse ...

  5. 初始数据结构(python语言)

    数据结构 概念:数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成 算法复杂度 时间复杂度 时间复杂度是同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法 ...

  6. Python线性表——单链表

    1. 线性表简介 线性表是一种线性结构,它是由零个或多个数据元素构成的有限序列.线性表的特征是在一个序列中,除了头尾元素,每个元素都有且只有一个直接前驱,有且只有一个直接后继,而序列头元素没有直接前驱 ...

  7. 单链表的python实现

    首先说下线性表,线性表是一种最基本,最简单的数据结构,通俗点讲就是一维的存储数据的结构. 线性表分为顺序表和链接表: 顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素,称为线性表的顺序存 ...

  8. python数据结构与算法第七天【链表】

    1.链表的定义 如图: 注意: (1)线性表包括顺序表和链表 (2)顺序表是将元素顺序地存放在一块连续的存储区里 (3)链表是将元素存放在通过链构造的存储快中 2. 单向链表的实现 #!/usr/bi ...

  9. 用python实现单向链表

    单向链表 单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域.这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值. 表元素域ele ...

随机推荐

  1. Python简单文件读写

    ''' 用文件存储账户信息 使用列表存储多个账户信息,每个账户为一个字典对象 ''' users=[] #创建一个空列表 users.append({'id':'admin','pwd':'1235@ ...

  2. 微信小程序和公众号和H5之间相互跳转

    参考链接:https://www.imooc.com/article/22900 一.小程序和公众号 答案是:可以相互关联. 在微信公众号里可以添加小程序. 可关联已有的小程序或快速创建小程序.已关联 ...

  3. js new Date()参数格式

    最近在写页面使用new Date()获取时间戳在ie浏览器中测试发现无效:后来发现是参数格式问题, new Date()参数格式如下: 1.用整数初始化日期对象 var date1 = new Dat ...

  4. Spring4Shell的漏洞原理分析

    Spring框架最新的PoC 这两天出来的一个RCE漏洞,但是有以下的条件限制才行: 必须是jdk9及以上 必须是部署在tomcat的应用 是springmvc的或者webflux的应用 具体的可以查 ...

  5. Redux基础必知必会 reducer拆分 中间件 单向数据流

    什么是 redux? 三大原则? 什么是 redux Redux 是一个基于 js 的全局可预测状态容器,主要用于现代前端框架中进行全局状态管理,能够在不同组件之间进行状态共享 Redux 常与 Re ...

  6. SpringMVC基础原理

    1.拦截所有请求到DispatcherServlet 2.去寻找映射器 3.根据处理器适配器处理业务,返回视图 4.视图解析器解析显示视图

  7. Axios及其async await封装

    Axios(IE8+) 基于promise的http库可用于浏览器与node.js 1.特性 支持promise API 拦截请求和相应 转换请求数据和响应数据 取消请求 自动转换JSON数据 客户端 ...

  8. Dom基础(二):Dom性能优化

    一.尽量将DOM查询做缓存 1 let pElements = document.getElementById('div1') //将dom缓存 2 3 for(let i=0:i<pEleme ...

  9. 技术管理进阶——一线Leader怎么做?经理的速成宝典

    原创不易,求分享.求一键三连 本期培训材料关注公众号后回复:经理培训,获得 前段时间有个同学问我有没有一线Leader的速成培训课程,很好的问题,首先我们需要定义一下什么是小Leader: 所谓小Le ...

  10. Android C/C++层hook和java层hook原理以及比较

    作者:Denny Qiao(乔喜铭),云智慧/架构师. 云智慧集团成立于2009年,是全栈智能业务运维解决方案服务商.经过多年自主研发,公司形成了从IT运维.电力运维到IoT运维的产业布局,覆盖ITO ...