注:我是一个编程菜鸟,哪个大神看出来缺陷提点一下,感激不尽。

链表由一个个的节点串联而成,同一由first头指针管理,属于线性表中相比于数组,添加删除方便,但访问又有点慢的数据结构。

第一步:节点 Node的类。

class Node
{
    friend class List;//把List声明为友类,好在List类中容易访问Node的私有成员。
private:
    char Data;
    Node* next;
} ;//节点有两个数据成员,数据域的字符类型的 Data,以及指向下一个节点的指针域 next。

第二步: 链表List的类。

class List
{
    Node* first;//第一个节点的指针
    Node* end;//最后一个节点的指针。。。这一个数据成员可有可无,我用来记录最后一个节点的指针,添加新元素将会很快。
public:
    //构造函数
    List()
    {
        first=nullptr;
        end=nullptr;
    }
    /*添加元素*/
    Node* push_back(char p_back)
    {
        Node* a=new Node;
        a->Data=p_back;
        a->next=nullptr;
        if(a!=nullptr)
        {
          if (!first) //添加时是第一个节点的情况
          {
              first=a;
              end=a;
           }
            end->next=a;//已添加的最后一个节点的next指针赋值新添加的节点地址
            end=a;//end赋新的节点的地址。
         
            return end;
        }
        else
        {
            cout<<"节点分配空间失败"<<endl;
            return nullptr;
        }
        }
    /*显示链表中的各个元素*/
    void print()
    {
        Node* h=first;
        if (!h)
        {
            cout<<"空链表"<<endl;
        }
        else
        {
            while (h)
            {
               cout<<h->Data<<" ";
                h=h->next;
            }
        }
    }
    /*链表元素计数*/
    long count()
    {
        long acount=0;
        Node* start=first;
        while (start) {
            acount++;
            start=start->next;
        }
        return acount;
    }
    /*链表逆序*/
    void reverse()
    {
      //尾指针指向first
        end=first;
     //第一个节点指针域设为Null ,为逆序链表的尾节点,在这之前需要找到下一个节点
        Node* behind=first;//这个指针要做为下一个节点的next域。
        Node* pre=first->next;//当前第一个节点的的next域,靠它寻找第二个节点
        first->next=nullptr;//第一个节点变为尾节点
        first=pre;//first指向第二个节点
        while (first->next!=nullptr)
         {
            pre=first->next;//用于对first赋值
            first->next=behind;
            behind=first;
            first=pre;//first指向第二个节点
         }
        //还得执行最后一步
        first->next=behind;
    }
};

验证:

#include <iostream>
#include "List.h"
using namespace std;
int main(int argc, const char * argv[])
{
    
    List  a;
    a.push_back('h');
    a.push_back('e');
    a.push_back('l');
    a.print();
    cout<<endl;
    cout<<"该链表有:"<<a.count()<<"个元素。"<<endl;
    cout<<endl;
    cout<<"链表逆序之后输出:"<<endl;
    a.reverse();
    a.print();
    cout<<endl;
    cout<<"该链表有:"<<a.count()<<"个元素。"<<endl;
    return 0;
}
结果:

h e l
该链表有:3个元素。

链表逆序之后输出:
l e h
该链表有:3个元素。
Program ended with exit code: 0

注:我没有写析构函数,这会造成该程序运行时它的内存空间泄露,不过程序结束后,内存会被全部回收的。所有便于演示就没有写析构,不过大家千万不要学我呀。

最新文章

  1. Python爬虫小白入门(四)PhatomJS+Selenium第一篇
  2. hihoCoder太阁最新面经算法竞赛15
  3. 超棒的javascript移动触摸设备开发类库-QUOjs
  4. netstat -an 提示:不是内部或外部命令
  5. WCF入门教程系列四
  6. Java中的逆变与协变(转)
  7. AngularJS基础总结
  8. 把int型非负数转换为英文
  9. Tempter of the Bone
  10. JNDI在server.xml中的配置(全局和局部的)
  11. centos7 nginx配置ssl证书实现https访问同时http访问
  12. Web的几种上传方式总结
  13. Array and Linkedlist区别与操作的时间复杂度(转载)
  14. yii2 mysql根据多个字段的数据计算排序
  15. PHP中=&gt;是什么意思
  16. 【转】linux中inittab文件详解
  17. ADO POST时出现“无法为更新定位行,一些值可能已在最后一次读取后已更改”问题的解决方法
  18. synchronized-异常
  19. django模型详解(四)
  20. 自建yum镜像

热门文章

  1. 使用Cordova编译Android平台程序提示:Could not reserve enough space for 2097152KB object heap
  2. 使用HTTPS网站搭建iOS应用内测网站(OTA分发iOS应用)
  3. onload事件-----addLoadEvent函数
  4. C正则库做DNS域名验证时的性能对比
  5. Java学习手记2——多线程
  6. Windows Phone 一、XAML基础语法
  7. 浅谈Java中的引用
  8. HTML5&amp;CSS3练习笔记(一)
  9. Oracle 12c In Memory Option初探
  10. C语言 05 数组