节点插入以及节点的删除
当时自己写节点的删除以及节点的插入的时候与教材上的写法不同,总的来说呢我写的较为复杂,同时也花了半天得到时间才搞懂书上为什么控制条件的语句可以写的这么简洁,来记录一下我的思路以及体会。
这个是我当时自己写的节点的插入
pNODE insert_list(pNODE pHead,int value,int location){
pNODE p=(pNODE)malloc(sizeof(NODE));
p->data=value;
pNODE px=pHead;
pNODE p1=pHead->next;
if(pHead->next==NULL){
pNODE p1=pHead;
p1->next=p;
p->next=NULL;
return pHead;
}
else{
if(location<=list_len(pHead)){
while(location-1){
p1=p1->next;
px=px->next;
location=location-1;
}
px->next=p;
p->next=p1;
return pHead;
}
else {
for (int i=0;i<list_len(pHead)-1;i++){
p1=p1->next;
}
p1->next=p;
p->next=NULL;
return pHead;
}
}
}
书上的思路
pNode insert_list(pNode pList,int value,int location){
int j=0;
pNode p=pList;
while(pList&&j<location-1){
p=p->pNext;
j++;
}
if (!p||j>location-1){
printf("错误");
exit(-1);
}
pNode pNew=(pNode)malloc(sizeof(NODE));
pNew->data=value;
pNew->pNext=p->pNext;
p->pNext=pNew;
return pList;
}
书上的思路为,指向头节点得到指针p不断往后移直到到达插入节点的前一个节点位置停止,或者是当p已经等于链表尾节点的pNext(尾节点的pNext=NULL,意味着p此时也等于NULL)的终止后移。
注意此时接下来就会进行一个判断
- 上述的循环执行没有,也就是当如果给定位置为0也就是头节点时是不可以插入的同时上述循环也未执行。
- 判断p是等于NULL,如果等于则等价于p应该还要往后移,但是链表的长度已经不允许p往后移了,此时也应该返回报错信息。
总结
首先p是要移动到插入位置的前一个节点位置。但是p如果刚好指向尾节点意味着要在链表末尾插入一个节点。
若p移动到尾节点的pNext则意味着p=NULL也代表着p还没有移动完就因为链表的长度而终止。这两个要有所区分!!!
链表的删除
链表的节点删除和节点增加区别
在第一步p指针后移阶段条件为p->pNext!=NULL这是因为在插入节点时如果在链表的末尾插入则p指针会指向链表的最后一个节点(也就是插入位置的前节点),但是在删除时如果p指向尾节点则意味着删除的节点的前节点就是尾节点,要删除的节点就是一个不存在的节点,相互矛盾,所以删除的节点位置最大只能为尾节点的位置,此时p能指向的最远位置为倒数第二个节点!!!