带头结点的链表

本文介绍了链表的基本概念,强调了链表作为数据结构在内存中的非连续性存储特性,并对比了与数组的区别。文章详细阐述了在C++中如何初始化头结点、插入节点、删除节点、修改节点值、查找节点以及反转链表的操作,并提供了完整的代码示例。
摘要由CSDN通过智能技术生成

链表

链表是一种线性表,是数据结构中的一种。在内存中是一种非连续性的存储结构,数据元素的逻辑是依靠指针来实现链接。所以,链表不支持随机访问,和另一种数据结构数组时不同的。但是比数组好的一点是她在插入删除中会非常高效。数组在这方面不如链表理想。
在这里插入图片描述

链表包括数据域和指针

初始化头结点

在C++的构造函数里面对头指针进行初始化:

Link::Link()
{
   
    head = new Node;
    head->_val = -1;
    head->_next = NULL;
}

插入节点

需要先new一个新节点cur出来,然后将cur的next指针指向head->next的地址,最后再将head->next指向cur。
在这里插入图片描述

删除节点

先遍历到指定节点的前一个节点,然后将next指针指向被删除的节点的next。然后delete那个悬空节点。
在这里插入图片描述

修改节点的值

先遍历找到节点,然后将data修改就可以了。
在这里插入图片描述

查找节点

通过遍历节点找到相应的节点。

链表反转

需要创建三个指针,分别指向第一个第二个第三个节点,将第一个结点的指针指向NULL,然后把第二个结点指向第一个结点,用第三个节点进行遍历,依次修改节点的next指针。
在这里插入图片描述

完整代码:

#include <iostream>

using namespace std;

class Node
{
   
public:
    int _val;
    Node* _next;
};

class Link
{
   
private:
    Node* head;
public:
    Link(); //构造函数
    ~Link();    //析构函数
    int CreateLink(int n);     // 创建链表
    int getLength(); //获取链表长度
    bool isEmpty(); //判断是否为空表
    void insert(const int& data);  // 尾部插入元素
    void insertAthead(const int& data); // 头部插入元素
    void insert_pos(const int& pos, const int& data);   // 按位置插入元素
    void erase(const int& data);   //删除指定数据
    void eraseAthead();     //删除头结点
    void eraseAtEnd();      //删除尾结点
    int update(const int& n, const int& data);  //修改指定位置的数据
    void reverse(); //反转链表
    void print();   //打印链表
    int find_pos(const int& data);   //查找数据下标
    int find(const int& n);   //查找第n个元素是什么
    void destory(); //销毁链表
};

Link::Link()
{
   
    head = new Node;
    head->_val = -1;
    head->_next = NULL;
}

Link::~Link()
{
   
    cout << "下次再见!" << endl;
}

// 创建链表
int Link::CreateLink(int n) {
   
    if (n < 0) return -1;
    Node* ptr, * tmp;
    ptr = head;
    for (int i = 0; i < n; ++i) {
   
        cout << "请输入链表第" << i + 1 << "的值" << endl;
        tmp = new Node;
        cin >> tmp->_val;
        ptr->_next = tmp;
        tmp->_next = NULL;
        ptr = tmp;
    }
    return 0;
}

//销毁链表
void Link::destory() {
   
    if (head == NULL || head->_next == NULL) {
   
        cout << "链表为空!" << endl;
        return;
    }
    else {
   
        // 从头结点的下一个开始销毁
        Node* ptr = head->_next;
        while (ptr->_next != NULL) {
   
            Node
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值