• 链表随笔之双向链表


     和单链表差不多,就不多说了。

    特别注意在插入和删除链表元素操作时,仔细考虑该元素与相邻元素的前向指针、和后续指针的改变。

    struct Node 
    {
        int val;
        Node* pret;
        Node* next;
    };
    
    Node* cre_list(int n)         //创建双向链表 n代表元素个数
    {
        Node* head_temp = NULL;
        if (n > 0)
        {
            Node* head = new Node;
            head->val = rand()%100;
            head->pret = NULL;
            head->next = NULL;
            head_temp = head;
    
            for (int i = 1 ; i < n;++i)
            {
                Node* temp = new Node;
                temp->val = rand()%100;
                temp->next = NULL;
                temp->pret = head;
                head->next = temp;
                head = temp;
            }
        }
        return head_temp;
    }
    int get_len(Node* head)           //获得双向链表长度
    {
        int num = 0 ;
        Node* temp = head;
        while (temp != NULL)
        {
            ++num;
            temp = temp->next;
        }
        return num;
    }
    void display(Node* head)          //输出元素
    {
        Node* temp = head;
        while (temp != NULL)
        {
            cout<<temp->val<<' ';
            temp = temp->next;
        }
        cout<<endl;
    }
    void charu(Node* &head,int n,int pos) //插入元素
    {
        int len = get_len(head);
        if (pos < 0||pos > len)
        {
            return;
        }
        Node* temp = head;
        Node* new_one = new Node;
        new_one->val = n;
        if (pos == 0)                     //插入在第一个位置 3
        {
            new_one->pret = NULL;
            new_one->next = temp;
            temp->pret = new_one;
            head = new_one;
        }
        else if (pos == len)            //插入到最后一个位置 3
        {
            new_one->next = NULL;
            for (int i = 1; i < pos;++i)
            {
                temp = temp->next;
            }
            temp->next = new_one;
            new_one->pret = temp;
        }
        else                                //插入到中间 4
        {
            for (int i = 1 ; i < pos;++i)
            {
                temp = temp->next;
            }
            Node* temp2 = temp->next;
            new_one->next = temp2;
            temp2->pret = new_one;
            new_one->pret = temp;
            temp->next = new_one;
        }
    }
    void del_node(Node* &head,int n)   //删除节点
    {
        Node* temp = head;
        if (head->val == n)         //删除的是头节点  2
        {
            temp = head->next;
            temp->pret = NULL;
            delete head;
            head = temp;
        }
        else                                  //
        {
            temp = temp->next;
            while (temp != NULL)
            {
                if (temp->val == n)                 
                {
                    if (temp->next == NULL)               //删除的是最后个节点 1
                    {
                        Node* temp2 = temp->pret;
                        temp2->next = NULL;
                        delete temp;
                    }
                    else                                //删除中间部分的节点  2
                    {
                        Node* temp2 = temp->next;
                        Node* temp1 = temp->pret;
                        temp1->next = temp2;
                        temp2->pret = temp1;
                        delete temp;
                    }
                    return;
                }
                temp = temp->next;
            }
        }
        return;
    }
  • 相关阅读:
    【BZOJ-4289】Tax 最短路 + 技巧建图
    【BZOJ-3895】取石子 记忆化搜索 + 博弈
    【BZOJ-4569】萌萌哒 ST表 + 并查集
    【BZOJ-3832】Rally 拓扑序 + 线段树 (神思路题!)
    【BZOJ-4213】贪吃蛇 有上下界的费用流
    【BZOJ-3122】随机数生成器 BSGS
    【BZOJ-2299】向量 裴蜀定理 + 最大公约数
    【BZOJ-1441】Min 裴蜀定理 + 最大公约数
    【BZOJ-2438】杀人游戏 Tarjan + 缩点 + 概率
    【BZOJ-4310】跳蚤 后缀数组 + ST表 + 二分
  • 原文地址:https://www.cnblogs.com/itachi7/p/2579520.html
Copyright © 2020-2023  润新知