• C++链表 实操


    一、链表的基础操作

    1.定义一个链表

    struct ListNode{
        int val;
        ListNode *next,*last;
        ListNode(int x):val(x),next(NULL),last(NULL){}
    };

    2.创建一个基础链表(长度为n)

    ListNode* create_normal_list(int n){
        ListNode *head,*normal,*end; //创建头节点,中间节点,尾节点(当前最后一个节点)
        head=new ListNode(0); //分配内存
        end=head; //目前尾节点就是头节点
        for(int i=1;i<=n;i++){
            normal=new ListNode(0); //建立中间节点
            end->next=normal; //尾节点的下一个节点就是中间节点
            normal->last=end; //中间节点的前一个节点就是尾节点
            end=normal; //把尾节点往后移一位,变成当前的中间节点
        }
        end->next=NULL; //尾节点最后指向一个新的空地址
        head->last=NULL; //头节点的前一位不存在
        return head;
    } 

    3.创建环状链表

    将链表的尾节点练到头节点,就是一个环

    ListNode* create_circle_list(int n){
        ListNode *head,*normal,*end;
        head=new ListNode(0);
        end=head;
        for(int i=1;i<=n;i++){
            normal=new ListNode(0);
            end->next=normal;
            normal->last=end;
            end=normal;
        }
        end->next=head; //尾节点的下一位指向头节点
        head->last=end; //头节点的前一位指向尾节点
        return head;
    }

    4.修改链表的数据

    将链表list上第n个位置的值改为x

    void change_value(ListNode* list,int n,int x){
        ListNode* p=list;
        for(int i=0;i<n;i++){ //移动到第n个位置
            p=p->next;
        }
        p->val=x; //修改值
    }

    5.删除节点

    相当于将这个位置抠掉,前一个节点的next指向p节点的后一个,后一个节点的last指向p节点的前一个

    void delete_point(ListNode* list,int n){
        ListNode* p=list;
        for(int i=0;i<n;i++){ //移动到第n个位置
            p=p->next; 
        }
        p->last->next=p->next; //将节点p的前一个节点的后一个节点指向p的后一个节点
        p->next->last=p->last; //将节点p的后一个节点的前一个节点指向p的前一个节点
        free(p); //删除p这个节点
    }

    6.插入节点

    在链表list的第n个位置的后面插入一个新节点

    void insert_point(ListNode* list,int n,int x){ //在第n个位置后面插入新节点
        ListNode* p=list;
        for(int i=0;i<n;i++){ //移动到第n个位置
            p=p->next;
        }
        ListNode* now; //新建一个节点
        now=new ListNode(0); //分配内存
        now->val=x; //新节点的值为x
        now->next=p->next; //新节点的后一个节点是p节点原本的后一个节点
        now->last=p; //因为插入在p节点后面,新节点的前一个节点是p节点
        p->next->last=now; //p节点的后一个节点,它的前一个节点变成新节点
        p->next=now; //p节点的后一个节点变成新节点
    }

    7.查找节点

    ListNode* search_point(ListNode* list,int n){
        ListNode* p=list;
        for(int i=0;i<n;i++){
            p=p->next;
        }
        return p;
    }

    二、链表的应用

  • 相关阅读:
    BZOJ 2006: [NOI2010]超级钢琴 [ST表+堆 | 主席树]
    CF 741D. Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths [dsu on tree 类似点分治]
    CF 716E. Digit Tree [点分治]
    CF 291E. Tree-String Problem [dfs kmp trie图优化]
    CF 208E. Blood Cousins [dsu on tree 倍增]
    CF 246E. Blood Cousins Return [dsu on tree STL]
    CF 570D. Tree Requests [dsu on tree]
    [dsu on tree]【学习笔记】
    测试markdown
    BZOJ 1969: [Ahoi2005]LANE 航线规划 [树链剖分 时间倒流]
  • 原文地址:https://www.cnblogs.com/whdsunny/p/12563656.html
Copyright © 2020-2023  润新知