您的位置:首页 > 编程语言 > C语言/C++

C++ linked list: 向一个链表中的某一个特定的位置添加节点

2014-07-07 20:01 465 查看
Insertting a node into a linked list at a particular loacation:


例如上图中, 我们想要按照头一个字母的先后顺序将一个新产生的node(Data 首字母为K)添加到这个链表中。 显然我们不能用AddToHead() 函数, 因为K是在A的后面的。 这个节点应该在图中的Jim 和Mike之间。 当然我们有的时候并不知道linked list 的内容, 只知道新的节点插入链表中的规则。

我们所能做的就是遍历链表, 找到节点所应该插入的位置, 然后修改节点的内容, 插入。

但是细分下来, 有 3 cases.

case1:

inserting a node into an enpty list(best case):

用下图解释:





然后执行语句:

head = newNode, 既可以插入:





case 2: Insert node at the head of the list:







此时, 我们遍历链表, 发现节点应该放在第一个节点之前。 我们执行如下语句:

NewNode -> next = head;

head = newNode;





case 3:

此时, 我们使用遍历指针curr遍历链表, 找到了新的节点所在的位置:





此时, 定义指针curr,指向第一个节点:



我们将newNode->Data (为Sally)和curr->Data(为April)相比较, 发现newNode 位于第一个节点之后, 所以我们移动第一个节点, 到第二个节点:



在比较, 发现应该在Bob节点 之后:



移动curr, 再一次比较, 发现应该在Tom之前, 所以停止遍历, 执行插入操作:

newNode -> next = curr;



此时, 出现了一个问题。 就是我们不知道curr 前一个node的位置, 也就无法将这个node的next指针指向newNode, 如果我们单单为了寻找此时curr之前的节点位置在来一次循环的话, 那么不免是一种时间的浪费。

所以我们的解决办法是定义两个指针。 一个是curr指针, 一个是trail 指针。 最开始curr指向链表第一个节点, trial指向NULL:





接下来, 我们比较curr指针指向的节点与newNode 节点的Data, 发现newNode 应该位于currNode之后。 此时, 在移动curr之前, 我们需要将curr的当前内容保存在trial里。 接下来在移动curr指针指向下一个节点:





依次类推直至找到newNode应该插入的位置(curr前面):







接着运行如下语句:

newNode -> next = curr;

trail->next = newNode;

这样就完成了插入节点的任务:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐