链表插入
上一节
在链表的前面添加一个节点有四个步骤。
- 创建一个空节点。空节点就是执行插入的程序时不该为该节点的数据成员赋值
- 该节点的info成员初始化为特定的数据。
- next成员指向链表的第一个节点的指针,这就是head的当前值。
- 新的节点放在表中的第一个位置。所以把head更新为指向新节点的指针。
这四个步骤由上一节中的addToHead()执行。有一种特殊情况,向空链表中插入一个新节点,head和tail都是null。他们都是指向新链表中的唯一节点,在非空链表中只有head需要更新。
在链表的后面添加一个节点。
- 创建一个空节点。
- 将该节点的info初始化为整数el。
- 因为该节点要接到末尾所以将next初始化为null。
- 让链表最后一个节点的next成员指向新建的节点,就将新节点添加到了链表中。
- 新的节点在链表的最后一个位置,这一点必须反映在tail上。所以让tail指向新的节点。
这些步骤都体现在addToTail()的if语句中执行。这个函数的else语句只有在链表为空时才能执行。如果不包括这种情况,程序就有可能崩溃。
总结:
向前插入不需要考虑第一个节点是否存在而导致的程序崩溃。向后插入如果最后一个节点不存在无法找到节点指向插入的节点导致程序崩溃。
在链表的前面插入节点和在链表的末尾插入节点过程相似,因为用到了head和tail两个指针。所以前面的两个函数都能在固定时间内执行O(1),试想如果没有tail那么向后插入将会变得复杂需要O(n)步来完成这一操作将会与来链表的长度成正比。
,