双向链表

2017-08-28 20:46:09

writer:pprp

双向链表比单链表每个节点还多了一个 pre 可以从当前节点找到上一个节点,操作比较方便,

但是由于指针较多,容易乱,所以写代码的时候要画图

代码及解释&测试如下:

/*
@theme: 双链表
@writer:pprp
@start:19:13
@end:20:17
@declare:有两个指针比较好操作,但是也比较乱
@date:2017/8/28
*/

#include <bits/stdc++.h>

using namespace std;

struct node
{
    int data;
    node * pre;
    node * next;
};

class LinkList
{
private:
    node *head;
    node *tail;
    int len;
public:
    LinkList();
    //构建节点
    node * makeNode();
    //添加节点到尾端
    bool push(int data);
    //弹出最后一个节点
    int pop();
    //通过index来查找元素
    int FindAt(int index);
    //插入元素到指定位置
    bool Insert(int index, int data);
    //遍历打印
    void display(bool tag);
};

LinkList :: LinkList()
{
    head = makeNode();
    tail = head;
    len = 0;
}

//构建节点
node * LinkList::makeNode()
{
    node * newNode = new node();
    return newNode;
}
//添加节点到尾端
//test:ok
bool LinkList::push(int data)
{
    //mine
    node * newNode = new node();
    newNode->data = data;
    newNode->pre = tail;
    tail->next = newNode;
    tail = newNode;
    len++;
    return true;
}
//弹出最后一个节点
//test:ok
int LinkList::pop()
{
    int ans;
    node * tmp = tail;
    tail = tail->pre;
    ans = tmp->data;
    delete(tmp);
    tail->next = NULL;
    tmp = NULL;
    len--;
    return ans;
}

//通过index来查找元素
//test:ok
int LinkList::FindAt(int index)
{
    if(index < 1 || index > len)
        return 0;
    int data = 0;
    node * it = head;
    for(int i = 0 ; i < index ; i++)
    {
        it = it->next;
    }
    data = it->data;
    return data;
}

//插入元素到指定位置
//test:ok
bool LinkList::Insert(int index, int data)
{
    if(index < 1 || index > len)
        return false;
    node *it = head;
    for(int i = 0 ; i < index ; i++)
        it = it ->next;
    node * newNode = new node();
    newNode->data = data;
    it = it->pre;
    newNode->next = it->next;
    it->next = newNode;
    newNode->pre =  it;
    it = newNode->next;
    it->pre = newNode;
    len++;

    return true;
}

//遍历打印,tag = 1 正向遍历,tag = 0 方向遍历
//test :ok
void LinkList::display(bool tag)
{
    if(tag == 1) //--ok
    {
        node * it = head->next;
        while(it)
        {
            cout << it->data <<" ";
            it = it->next;
        }
        cout << endl;
    }
    else  //-- ok
    {
        node * it = tail;
        while(it!=head) //条件修改为head
        {
            cout << it->data << " ";
            it = it->pre;
        }
        cout << endl;
    }
}

int main()
{
    LinkList *p = new LinkList();
    for(int i = 0 ; i < 10 ; i++)
    {
//        srand((int)time(NULL) + i);
//        p->push(rand()%100);
        p->push(i+1);
    }

    p->display(true);
    cout << "-----" << endl;
    p->display(false);

    cout << p->pop() << endl;
    
    p->display(true);
    cout << "-----" << endl;
    p->display(false);
    
    cout << p->FindAt(5) << endl;

    p->Insert(5,817);
    
    p->display(true);
    cout << "-----" << endl;
    p->display(false);   


    return 0;
}
原文地址:https://www.cnblogs.com/pprp/p/7445700.html