使用C++实现简单(阉割版)的单链表:
实现的功能有:插入节点、删除节点、查找、显示列表。

#ifndef FORWARDLIST_H_#define FORWARDLIST_H_#include <iostream>using std::cout;using std::endl;template<class T>struct ListNode{    T m_data;    ListNode<T>* m_pNext;};template<class T>class ForwardList{public:    ForwardList(const ListNode<T>* node);    ~ForwardList();    //在pos位置节点后边插入节点node    void Insert(ListNode<T>* pos, const ListNode<T>* node);     //删除位于pos位置的节点    ListNode<T> Delete(ListNode<T>* pos);     //删除所有值为value的节点    void Delete(const T& value);     //按值查找    ListNode<T>* Find(const ListNode<T>* node);     //按位置查找    ListNode<T>* Find(int idx);     //显示整个列表    void PrintList();    int size()    {        return count;    }    //返回头节点    ListNode<T>* Head()     {        return m_pHead;    }private:    ListNode<T>* m_pHead;    int count;};template<class T>ForwardList<T>::ForwardList(const ListNode<T>* node){    m_pHead = new ListNode<T>;    m_pHead->m_data = node->m_data;    m_pHead->m_pNext = nullptr;    count = 1;}template<class T>ForwardList<T>::~ForwardList(){    ListNode<T>* pos;        while (m_pHead != nullptr)    {        pos = m_pHead;        m_pHead = m_pHead->m_pNext;        delete pos;    }}template<class T>void ForwardList<T>::Insert(ListNode<T>* pos, const ListNode<T>* node) {    ListNode<T>* temp = new ListNode<T>;    temp->m_data = node->m_data;    temp->m_pNext = pos->m_pNext;    pos->m_pNext = temp;    count++;}template<class T>ListNode<T> ForwardList<T>::Delete(ListNode<T>* pos)  {    ListNode<T> ret;    ListNode<T>* temp;    temp = m_pHead;    if (temp == pos)    {        m_pHead = m_pHead->m_pNext;        ret.m_data = temp->m_data;        ret.m_pNext = nullptr;        delete temp;        count--;        return ret;    }    while (temp->m_pNext != pos)    {        temp = temp->m_pNext;    }        ret.m_data = temp->m_pNext->m_data;    ret.m_pNext = temp->m_pNext->m_pNext;    delete temp->m_pNext;    temp->m_pNext = ret.m_pNext;    ret.m_pNext = nullptr;    count--;    return ret;}template<class T>void ForwardList<T>::Delete(const T& value)  {    ListNode<T>* temp;    ListNode<T> ret;    temp = m_pHead;    while (m_pHead != nullptr && m_pHead->m_data == value)    {            m_pHead = m_pHead->m_pNext;        delete temp;        count--;        temp = m_pHead;    }    while (temp != nullptr)    {        if (temp->m_pNext != nullptr && temp->m_pNext->m_data == value)        {            ret.m_pNext = temp->m_pNext;            temp->m_pNext = temp->m_pNext->m_pNext;            delete ret.m_pNext;            count--;        }        else        {            temp = temp->m_pNext;        }    }}template<class T>ListNode<T>* ForwardList<T>::Find(const ListNode<T>* node){    ListNode<T>* pos = m_pHead;    while (pos != nullptr && pos->m_data != node->m_data)    {        pos = pos->m_pNext;    }    return pos;}template<class T>ListNode<T>* ForwardList<T>::Find(int idx) {    if (idx >= count || idx < 0)    {        cout << "索引溢出!\n";        return nullptr;    }    ListNode<T>* pos = m_pHead;    int i = 0;    while (i < idx)    {        pos = pos->m_pNext;        i++;    }    return pos;}template<class T>void ForwardList<T>::PrintList(){    ListNode<T>* pos = m_pHead;    while (pos != nullptr)    {        cout << pos->m_data << endl;        pos = pos->m_pNext;    }}#endif

测试代码:

#include <iostream>#include <string>#include "ForwardList.h"using namespace std;int main(){    ListNode<string> head{ "0000", nullptr };    ListNode<string> n1{ "0001", nullptr };    ListNode<string> n2{ "0002", nullptr };    ListNode<string> n3{ "0003", nullptr };    ListNode<string> n4{ "0004", nullptr };    ListNode<string> n5{ "0005", nullptr };    ForwardList<string> mfl(&head);    mfl.PrintList();    cout << endl;    mfl.Insert(mfl.Head(), &n1);    mfl.Insert(mfl.Head(), &n2);    mfl.Insert(mfl.Head(), &n3);    mfl.Insert(mfl.Head(), &n4);    mfl.PrintList();    cout << endl;    cout << mfl.Find(2)->m_data << endl << endl;    mfl.Insert(mfl.Find(&n2), &n5);    mfl.PrintList();    cout << endl;    mfl.Delete("0000");    mfl.Delete("0001");    mfl.Delete(mfl.Find(&n5));    mfl.PrintList();    cout << endl;    system("pause");    return 0;}

~~