反转链表(迭代)

image.png

反转链表不是移动节点,而是通过修改节点之间的link,达到反转链表的效果

void Reverse()
{
	Node* pre,*next,*current;
	pre = NULL;
	current = head;
	while (current != NULL)
	{
		next = current->link;
		current->link = pre;
		pre = current;
		current = next;
	}
	head = pre;
}

反转链表的关键是让下一个节点的link指向前一个节点,这就需要三个节点指针变量,一个存放head,用来遍历链表,pre和next存放前一个节点和下一个节点的链接。我们通过头节点和第一个节点来演示一下代码逻辑。首先保存第一个节点的下一个节点的位置,然后通过current->link指向前一个pre,pre我们之前我们已经置0,接下来就是移动pre和current,然后再继续修改current->link指向pre节点,Easy!
全部代码:

#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();
void Delete(int n);
void Reverse();
int main()
{
	head == NULL;

	Insertnew(2, 1);
	Insertnew(4, 2);
	Insertnew(7, 1);
	Insertnew(10, 2);
	Printf();
	Reverse();
	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");
}
void Delete(int n)
{
	Node* temp = head;
	if (n == 1)
	{
		head = temp->link;
		free(temp);
	}
	else
	{
		for (size_t i = 0; i < n - 2; i++)
		{
			temp = temp->link;
		}
		Node* temp1 = temp->link;
		temp->link = temp1->link;
		free(temp1);
	}

}
void Reverse()
{
	Node* pre,*next,*current;
	pre = NULL;
	current = head;
	while (current != NULL)
	{
		next = current->link;
		current->link = pre;
		pre = current;
		current = next;
	}
	head = pre;
}

运行截图:

image.png

我这里将head作为全局变量,因此不需要给函数传参,如果你是局部变量,你需要将head更新返回。

网站标题:CV鼻祖洋芋

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

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

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

相关推荐

发表回复

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