用C++实现双向链表

来源:互联网 发布:国产电视知乎 编辑:程序博客网 时间:2024/06/03 23:43
#include<iostream>#include<assert.h>using namespace std;typedef int DataType; struct ListNode{    ListNode* _next;    ListNode* _prev;    DataType _data;    ListNode(DataType x)        :_data(x)        , _next(NULL)        , _prev(NULL)    {}};class List{    typedef ListNode Node;public:    List()        :_head(NULL)        , _tail(NULL)    {}    List(const List& l)//拷贝构造        :_head(NULL)        , _tail(NULL)    {        if (l._head == NULL)        {            _head = _tail = NULL;        }        else        {            Node* head = l._head;            while (head)            {                PushBack(head->_data);                head = head->_next;            }        }    }void Destroy(){    Node*cur = _head;    while (cur)    {        Node* del = cur;        cur = cur->_next;        delete del;    }    _head = _tail = NULL;}List& operator=(const List& l){    if(this != &l)    {        Destroy();        Node*head = l._head;        while (head)        {            PushBack(head->_data);            head = head->_next;        }    }    return *this;}~List() {    Destroy();}void PushBack(DataType x){    if(_head == NULL)    {        _head = _tail = new Node(x);        return;    }    else    {        Node* tmp =new Node(x);        _tail->_next = tmp;        tmp->_prev = _tail;        _tail = _tail->_next;        //_tail = tmp;    }}void PopBack(){    assert(_head);    if(_head == _tail)    {        delete _head;        _head = _tail =NULL;    }    else    {        Node* prev =_tail->_prev;        prev->_next = NULL;        delete _tail;        _tail = prev;    }}void PushFront(DataType x){    if(_head = NULL)    {        _head = _tail = new Node(x);        return;    }    else    {        Node* tmp =new Node(x);        _head->_prev = tmp;        tmp->_next =_head;        _head = _head->_prev;    }}void PopFront() {    assert(_head);    if(_head = _tail)    {        delete _head;        _head = _tail =NULL;    }    else    {        Node* head = _head->_next;        delete _head;        _head = head;    }}// 在pos的前面插入一个 void Insert(Node* pos, DataType x){    assert(pos);    if(pos == _head)    {        PushFront(x);    }    else    {        Node*prev = pos->_prev;        Node*tmp = new Node(x);        prev->_next = tmp;        tmp->_prev = prev;        tmp->_next = pos;        pos->_prev = tmp;    }}void Erase(Node* pos) {    assert(pos);    if(pos == _head)    {        PopFront();    }    else if(pos == _tail)    {        PopBack();    }    else    {        Node* prev = pos->_prev;        Node* next = pos->_next;        prev->_next = next;        next->_prev = prev;        delete pos;    }}Node* Find(DataType x){    Node* cur = _head;    while(cur)        if(cur->_data = x)        {            return cur;        }        cur = cur->_next;}void Reverse() {//双向链表的逆转    Node* begin = _head;    Node* end = _tail;    while (begin != end&&begin->_prev != end)    {        swap(begin->_data,end->_data);    }}private: Node* _head; Node* _tail; };
原创粉丝点击