一、链表的基础操作
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; }
二、链表的应用
来源:https://www.cnblogs.com/whdsunny/p/12563656.html