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

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;

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值