链表任意位置插入节点

之前我们的链表代码只能从头部插入节点,也就是通过修改head指向新节点,然后新节点指向head之前指向的节点达到增加头节点的目的。

image.png

我们将参照上图,演示如何在任意位置插入节点。我们要插入任意节点首先是这个节点,存在可插入位置,比如我要插入2,那么就必须存在1这个位置,我这里不讨论这种意外情况。下面我们就在2的位置插入一个节点;
在2的位置加入节点,,我们肯定需要到1的位置,也就是n-1的位置,n是我们要增加节点的位置。通过一个for循环和一个临时节点,用临时节点先指向head,我们指向n的前一个节点,因为现在我们指向的是head,所以我们要减2,代码如下:

Node* temp1 = head;
	for (size_t i = 0; i < n - 2; i++)
	{
		temp1 = temp1->link;
	}

这样temp1就是当前1的位置,我们就可以链接n-1节点和新增节点(首尾链接),代码如下:

	temp->link = temp1->link;
	temp1->link = temp;

image.png

这里我们需要注意的是,插入任意节点只有存在n-1节点时候,才可以插入,所以我们要考虑n是1的情况,也就是之前章节我们提到的要插入头节点的位置。

Node* temp = new Node;
	temp->data = x;
	temp->link = NULL;
	if (n == 1)
	{
		temp->link = head;
		head = temp;
		return ;
	}

粘出来全部代码,大家自己运行看一下

#include<stdio.h>
#include<stdlib.h>
#pragma warning (disable:4996)
struct Node
{
	int data;
	struct Node* link;
};
struct Node* head;//头节点
void Insertnew(int x, int n);
void Printf();
int main()
{
	head == NULL;

	Insertnew(2, 1);
	Insertnew(4, 2);
	Insertnew(7, 1);
	Insertnew(10, 2);
	Printf();

}
void Insertnew(int x, int n)
{
	Node* temp = new Node;
	temp->data = x;
	temp->link = NULL;
	if (n == 1)
	{
		temp->link = head;
		head = temp;
		return ;
	}
	Node* temp1 = head;
	for (size_t i = 0; i < n - 2; i++)
	{
		temp1 = temp1->link;
	}
	temp->link = temp1->link;
	temp1->link = temp;
}
void Printf()
{
	Node* temp = head;
	printf("List is");
	while (temp != NULL)
	{
		printf(" %d ", temp->data);
		temp = temp->link;
	}
	printf("\n");
}

网站标题:CV鼻祖洋芋

原创文章,作者:locus,如若转载,请注明出处:https://blog.cvpotato.cn/forward-code/c-2/137/

本博客所发布的内容,部分为原创文章,转载注明来源,网络转载文章如有侵权请联系站长!

(0)
上一篇 2024年11月14日 下午2:55
下一篇 2024年11月14日 下午3:02

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注