链表操作总结

来源:互联网 发布:域名注册扫描工具 编辑:程序博客网 时间:2024/06/06 12:09

链表的操作原理很容易理解,关键是用编程语言来实现,在实现的过程中要多思考,列举操作的所有可能性,并且要多虑多种可能情况,都要在代码中体现,否则很容易出现运行错误。尤其是因为链表中的关键----指针,要密切注意各种操作,指针的移动和赋值情况。以下从几个方面来说明注意的主要环节:

(1)对于链表的操作,所有的操作都要分当前链表是否为空链表的判断(空链表中没有结点,即链表的头指针为空),分为当前链表为空时的操作和不为空时的操作。

(2)对于链表的建立,分为头插法建立链表(新创建的结点总是连在已创建的链表的头部,作为链表新的头结点)和尾插法创建链表(新创建的结点总是连在已创建的链表的尾部)。

头插法建立链表:此情况必须考虑第一个结点要作为链表的尾部,所以next指针要为空,并且每加入一个新结点链表的头指针就要发生变化,即为新结点地址。

尾插法建立链表:第一次加入新结点时,链表头指针改变,由NULL变为第一个结点地址,以后再加入结点因为是加在链表尾部,所以头指针不再发生变化,但最后加入的结点要将next成员设为NULL,作为链表的尾部。

(3)对于创建链表、插入结点、删除结点等操作,一定要返回操作后新链表的地址,因为这些操作都有可能改变链表的头指针。如果插入的结点插入到了链表头部,如果删除的结点时链表中的第一个结点,操作后头指针都会发生变化。

(4)对于创建链表,在用户输入时,为了今后根据数据大小进行结点插入操作,往往需要输入的数据要有序。如果不通过输入时有意输入有序数据建立链表,我们可以用插入结点的方式,依次插入不同的结点,因为一开始链表为空,那以后每加入一个结点,就会判断结点的插入位置,这种通过插入结点进行链表建立的方式可以达到输入数据无序,但建立的链表数据有序的目的。

(5)删除结点和删除整个链表是不同的。删除整个链表需要把链表中的所有结点都释放掉,最后使头指针为空。

(6)插入结点要注意的问题

为了能做到正确的插入,必须解决两个问题:
1-怎样找到插入的位置(类似于遍历,进行查找)。
      a. 如果链表是空的
      b.如果链表不是空的,则要找到要插入结点位置,要在此位置之前插入结点。
2-怎样实现插入。 
       a.要插入到链表首结点之前
       b.要插入非链首,非链尾位置(要在p所指结点之前插入,此时,需要q指向p之前的结点,即在qp之前插入结点)。
        c.要插入到链表尾。 

(7)删除结点要注意的问题

为了能做到正确的删除,必须解决三个问题:
1-怎样找到要删除的结点位置(类似于遍历,进行查找)。
      a. 空链表
      b.找到要删除的结点
      C.没找到要删除的结点
2-怎样实现删除。 
       a.要删除的结点是链表首结点
       b.要删除的结点不是链表首结点。(p指向要删除的结点,q指向p之前的结点)
3-删除结点还分删除单个结点还是可以删除重复数据多个结点情况
 
(8)静态链表和动态链表的区别
根据链表的建立是否是动态的,可以分为静态链表动态链表
 静态链表:链表中所有结点(结构体变量)都是在程序中定义的,不是临时开辟的,也不能用完后释放。
静态链表中的结点有名字,因此静态链表中的结点访问既可以通过变量名访问,又可以通过链表头指针逐一的访问结点。
动态链表:链表中各结点是可以随时插入和删除的,这些结点并没有变量名,只能先找到上一个结点,才能根据它提供的下一结点的地址找到下一个结点。只有提供第一个结点的地址,即头指针head,才能访问整个链表。
建立动态链表,要用到动态分配内存的运算符new动态撤销内存的运算符delete

 

 

原创粉丝点击