单链表插入新的结点,怎样操作?编程怎样实现?
链表插入本质上是,将“”插入节点“”的地址放入“上一个节点”内的指针处,将“下一个节点”的地址放入“插入节点”内的指针处。
楼上的例子是尾插,可以参考链接博客的插入部分。
给定一个链表头
head
,并且给定一个位置 $i(i \ge 0)$ 和 一个值 $v$,求生成一个值为 $v$ 的结点,并且将它插入到 链表 第 $i$ 个结点之后。
上图演示的是通过遍历,将数据为 8 的结点插入到链表第 1 个(下标从 0 开始)结点后的过程,其中:
head 代表链表头结点;
tail 代表链表尾结点;
pre 代表待插入结点的 前驱结点,也是 游标指针 指代的结点,即动图中的 橙色实心结点;
aft 代表 待插入结点 的 后继结点,即动图中的 蓝色实心结点;
vtx 代表将要插入的结点,即动图中的 绿色实心结点;
ListNode *ListInsertNode(ListNode *head, int i, DataType v) {
ListNode *pre, *vtx, *aft; // (1)
int j = 0; // (2)
pre = head; // (3)
while(pre && j < i) { // (4)
pre = pre->next; // (5)
++j; // (6)
}
if(!pre) {
return NULL; // (7)
}
vtx = ListCreateNode(v); // (8)
aft = pre->next; // (9)
vtx->next = aft; // (10)
pre->next = vtx; // (11)
return vtx; // (12)
}
pre -> vtx -> aft
;j == i
时,表明找到要插入的位置;v
的 孤立结点;vtx
插入到pre -> aft
之间,插入完毕后pre -> vtx -> aft
。主要逻辑如下:
struct StNode
{
int data;
struct StNode* next;
};
//插入
StNode* InsertNode(struct StNode* head,int v)
{
struct StNode* p,*t;
//创建新节点
t = (struct StNode*)malloc(sizeof(StNode));
t->data = v;
t->next = NULL;
if(head == NULL) return t;
//将节点插入到尾部:1.找到最后一个节点
p = head;
while(p->next)
p = p->next;
//2.插入
p->next = t;
return head;
}