自学链表的时候遇到了两种插入写法,整理如下:
- 索引数组版可以在任意位置插入数据,且不需要搜索数据的位置,时间复杂度为O(1);
- 指针版如果要任意位置插入数据,则要搜索对应节点,时间复杂度为O(n); 听说有高阶方法可以降低时间复杂度,但我目前不会。
自学时遇到的问题及注意事项如下图所示,
索引数组版
struct Node{
int pre,next,data;
Node(int _data=0,int _pre=0,int _next=0){
pre=_pre;data=_data;next=_next;
}
};
Node node[1000];
int tot=0,index[1000]={0};
void ins_back(int x,int y){
int now=index[x];
tot++;
node[tot]=Node(y,now,node[now].next);
node[node[now].next].pre=tot;
node[now].next=tot;
index[y]=tot;
}
void ins_front(int x,int y){
int now=index[x];
tot++;
node[tot]=Node(y,node[now].pre,now);
node[node[now].pre].next=tot;
node[now].pre=tot;
index[y]=tot;
}
void del_node(int x){
int now=index[x];
node[node[now].pre].next=node[now].next;
node[node[now].next].pre=node[now].pre;
index[x]=0;
}
now=node[0].next;
while(now){
cout<<node[now].data;
now=node[now].next;
}
return 0;
}
指针版
struct Node{//类似于迭代
int data ;
Node *pre;
Node *next;
};
Node *head,*tail,*temp;
int tot=0;
void ins_back(int x)
{
tot++;
temp =new Node;
temp->data = x;
temp->next = NULL;
temp->pre = tail;
if (tail != NULL)
{tail->next = temp;
tail = temp;
}
else{
tail = temp;
head = tail;
}
}
void ins_front(int x){
tot++;
temp=new Node;
temp->data=x;
temp->pre=NULL;
temp->next=head;
if(head!=NULL){
head->pre=NULL;
head = temp;
}
else{
head=temp;
tail=head;
}
}
void init()
{
nodeCount = 0;
head = NULL;
tail = NULL;
}
node *p=head;
while(p!=NULL){
cout<<p->data;
p=p->next;
}