单链表的基本操作

单链表是最基础的线性表。也是最常用的一种数据结构。线性表中数据元素之间的关系是一对一的关系,即除了头,尾元素之外,其它数据元素都是首尾相接的。线性表有两种存储方式,一种是顺序存储结构,另一种是链式存储结构。
在链表中,节点又data(数据域)和next(指针域,指向下一个节点的指针)构成;
类模板实现一个单链表和其基本操作:

#include <iostream>
using namespace std;
template<class T>
class ListNode
{
    ListNode()//初始化
    {
        next = NULL;
    }
    T data;//值
    ListNode* next;//指向下一个节点的指针
};

template <class T>//链表的声明,属性,方法
class mylist
{
private:
    ListNode<T>*node;
    ListNode<T>*pHead;
    ListNode<T>*pTail;
public:
    mylist();//初始化链表
    int Size();//节点个数
    void PushFront(T x);//头插
    void PushBack(T x);//尾插
    void insert(T x, ListNode<T>*p);//在P节点后插入值为x的节点
    void PopFront(T x);//头删
    void PopBack(T x);//尾删
    void Print();//打印
    void ReversePrint()//逆向打印,递归实现
    bool IsEmpty();//判断是否为空
    ListNode<T>*find(T X);//查找第一个值为X的节点,成功返回地址,失败返回NULL
};

template <class T>//初始化链表
mylist<T>::mylist()
{
    node = NULL;
    pHead = NULL;
    pTail = NULL;
    Listlen = 0;
};

template<class T>
int mylist<T>:: Size()
{
    int count = 0;
    while (pHead)
    {
        pHead = pHead->next;
        count++;
    };
    return count;
};

template<class T>
void mylist<T>::PushFront(T x)//头插
{
    node = new ListNode<T>();
    if (NULL == (pHead))//链表为空,直接返回该节点
    {
        pHead = node;
        return;
    }
    else
    {
        node->next = pHead;
        pHead = node;
    }
};

template<class T>//尾插
void mylist<T>::PushBack(T x)
{
    node = new ListNode<T>();
    if (NULL == (pHead))
    {
        pHead = node;
        return;
    }
    else
    {
        pTail->next = node;
        pTail = node;
    }
};
template <class T>
void mylist<T>::insert(T x, ListNode<T>*p)//p 节点之后插
{
    if (p == NULL) return;
    node = new ListNode <T>();
    node->data = x;
    node->next = p->next;
    p->next = node;
    if (node->next == NULL)//node 为尾节点
    {
        pTail = node;
    };
};

template<class T>
void mylist<T>::PopFront(T x)//头删
{
    if (NULL == pHead) return;

    else if (NULL == tmp->next)//有一个节点或多个节点
    {
        ListNode<T>* tmp = pHead;//保存头节点以便删除
        pHead = tmp->next;
        free(tmp);
    };
};

template <class T>
void mylist<T>::PopBack(T x)//尾删
{
    ListNode<T>* tmp = pHead;//保存头节点以便删除
    if (NULL == pHead) return;//链表为空直接返回
    else if (NULL == tmp->next)//只有一个节点时,free该节点,链表置空
    {
        free(pHead);
        pHead = NULL;
    };
    else(pTail = tmp->next)
    {
        pTail = tmp;//保存尾节点的上一个节点
        free(tmp->next);//删除
        tmp->next = NULL;
    };
};

template <class T>
void mylist<T>::Print()//打印
{
    node = pHead;//临时节点指向头节点
    while (NULL != node)//遍历链表
    {
        cout << node->data << endl;
        node = node->next;
    };
    cout << endl;
};

template<class T>
void mylist<T>::ReversePrint()//逆打印
{
    if (NULL == pHead) return;
    ReversePrint(pHead->next);
    cout << pHead->next << enddl;
};

template <class>
ListNode<T>* mylist<T>::find(T x)
{
    node = pHead;
    while ((NULL != node) && (node->data != x))//遍历链表,遇到值相等时跳出循环
    {
        node = node->next;
    };
    return node;
};
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值