C++链表 实操

百般思念 提交于 2020-03-25 04:25:03

一、链表的基础操作

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;
}

 

二、链表的应用

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!