我一开始学单链表时,明白原理,但是一看到那些操作,头就有点晕,一堆指针插进了我的头脑里,无法自拔。但是后来我发现那些操作中,也有一点规律,于是我便认真对比、归纳,终于得出了一些规律,但是这些规律,最好理解,不要死记(如果暂时有点乱,那就死记下来,然后冷静理解,也许到上机时你会突然发现要这样,这样表明你已经理解了这些规律,而不是死死地想起这些规律)。以下是我总结的规律:
1、first通常不移动,但除析构函数,通常用第二个指针(如p指针、q指针、r指针)来进行操作。
2、遍历、求长度、按位查找、按值查找这四个开头都有p=first->next; 即p都首先指向第一个非头结点
3、遍历、求长度、按位查找、按值查找、删除、插入一开始都需要扫描,即都有while语句与p指针
while(p!=NULL________) //公共部分
{
......
p=p->next;
......
}
4、插入与删除都是“先连后断”(这个最好看两个的示意图,理解)
5、凡是有p=p->next;和cout++; 顺序都是先p=p->next;后cout++; 简称:“先移后+”
6、只有按位查找、插入、删除有if() throw "位置";
7、若while条件中有count<_____,那么在while语句后肯定有if(p==NULL) throw "位置";
8、删除和插入操作开头都是p = first; count = 0; 而求长度时是:p = first -> next; count = 0;
当时我就有个疑问:为什么求长度时,p指针的起始位置是在第一个非头结点处,但是count计量器初始值为0,那么不就会少算一个(即第一个非头结点没算上)?
后来在我的左思右想中,我发现了因为它是先移动p指针,count再+1,当p移动到NULL时,count还会+1,此时count多加的这个1,就可以把第一个非头结点算上了,最后大功告成,give me five!
9、头插法和尾插法都有的公共部分:
first = new Node;
.......
for(i=0;i<n;i++)
{
s = new Node;
s -> data = a[i];
......
}
10、在按位查找、删除和插入中的while条件中,按位查找的是count<i , 而删除和插入则是count<i-1
如果乱了,可以这样理解,按位查找是查找第i个元素,所以count<i;删除和插入操作中要先找到第i-1个结点,所以就count<i-1。这表明,while条件中,如果count小于a,那就是循环到第a个结点就结束循环。
11、按位和按值查找中count=1,而求长度、插入、删除中count=0!
以下是我归纳的注意点:
①、删除时把被删除的数用一个变量保存下来,以便以后的操作。
②、记住:尾插法还要创建一个尾指针(如r)!到最后,还要加上 r ->next = NULL;
③、删除与析构操作中的q最后要delete!
④、删除中的if条件中还有 p->next == NULL;
⑤、书上的指针名不是唯一的,可以用其它字母、单词替换!!!!
以上只是博主小小小小小小小小小小的总结,学霸、学神可忽视,若有补充、错误,欢迎大家提出宝贵的意见。