一、链表的基础操作
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;
}
二、链表的应用