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;
这样就完成了插入节点的任务:
例如上图中, 我们想要按照头一个字母的先后顺序将一个新产生的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;
这样就完成了插入节点的任务:
相关文章推荐
- C++ linked list 中添加某一个特定位置节点
- leetcode之92. Reverse Linked List II(C++读错题版本,交换一个链表中指定的两个位置上的元素)
- [面试] - 在单链表末尾添加一个节点 C++ 实现
- 372. 在O(1)时间复杂度删除链表节点 (delete-node-in-the-middle-of-singly-linked-list)(c++)----lintcode面试题之链表
- LeetCode 237. Delete Node in a Linked List(删除链表中的一个节点)
- [面试] - 在单链表末尾添加一个节点 C++ 实现
- LeetCode 237. Delete Node in a Linked List - 删除链表中的一个节点
- Delete Node in a Linked List 删除链表的一个节点
- 466. 链表节点计数 (count-linked-list-nodes)(c++)----lintcode面试题之链表
- [C++]LeetCode 19: Remove Nth Node From End of List(删除链表中倒数第n个节点)
- LintCode Delete Node in the Middle of Singly Linked List 在O(1)时间复杂度删除链表节点
- leetcode——Reverse Linked List II 选择链表中部分节点逆序(AC)
- C++实现单链表(Singly-Linked List)追加、遍历、删除
- [LeetCode] Delete Node in a Linked List 删除链表的节点
- [CareerCup] 2.3 Delete Node in a Linked List 删除链表的节点
- [C++]LeetCode: 102 Flatten Binary Tree to Linked List (二叉树转前序链表)
- Leetcode Reverse Linked List II 反转特定区间的链表
- Linked List Cycle-- 判断一个单向链表中是否有环存在
- Insert into a sorted circular linked list 环状链表 插入节点
- 删除链表中一个位于中间位置的节点