p11 第60题 设计一个算法,逆序单链表中的数据 电子科技大学2014年数据结构(c语言代码实现)

 通过头插法可以实现单链表的逆置

下方博客有图解:

王道p40 5.将带头结点的单链表就地逆置,所谓“就地”是指辅助空间复杂度为O(1)-CSDN博客

单链表的逆置可以通过遍历链表,逐个将节点取出并插入到新链表的头部来实现。具体步骤如下:

1.定义一个新的空链表用于存储逆置后的结果。

2.定义一个指针变量p指向原链表的头节点,定义一个指针变量q用于保存下一个要处理的节点。

3.遍历原链表,每次将指针p指向的节点取出,并将节点的next指针指向新链表的头节点,然后将新节点设置为新链表的头节点。

4.将原链表的头节点指针p指向下一个要处理的节点,继续遍历整个链表,直到p指向空节点为止。 5.返回新链表的头节点作为逆置后的结果。

本题代码如下

void nizhi(linklist* L)
{
	lnode * r = (*L)->next;
	lnode* p = r;
	(*L)->next = NULL;
	while (p)
	{
		p = r->next;
		r->next = (*L)->next;
		(*L)->next = r;
		r = p;
	}
}

完整测试代码

#include<stdio.h>
typedef struct lnode
{
	int data;
	struct lnode* next;
}lnode,*linklist;
int a[5] = { 1,2,3,4,5 };
int n = 5;
void buildlist(linklist* L)
{
	*L = (lnode*)malloc(sizeof(lnode));
	(*L)->next = NULL;
	int i = 0;
	lnode* s = *L, * r = *L;
	for (i = 0; i < n; i++)
	{
		s = (lnode*)malloc(sizeof(lnode));
		s->data = a[i];
		s->next = r->next;
		r->next = s;
		r = s;
	}
	r->next = NULL;
}
void nizhi(linklist* L)
{
	lnode * r = (*L)->next;
	lnode* p = r;
	(*L)->next = NULL;
	while (p)
	{
		p = r->next;
		r->next = (*L)->next;
		(*L)->next = r;
		r = p;
	}
}
void print(linklist* L)
{
	lnode* k = (*L)->next;
	while (k)
	{
		printf("%d ", k->data);
		k = k->next;
	}
}
int main()
{
	linklist L;
	buildlist(&L);
	printf("原单链表为:");
	print(&L);
	nizhi(&L);
	printf("\n逆置后的单链表为:");
	print(&L);
	return 0;
}

最近更新

  1. TCP协议是安全的吗?

    2023-12-05 17:12:09       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-05 17:12:09       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-05 17:12:09       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-05 17:12:09       20 阅读

热门阅读

  1. 一台服务器能放多少个网站?

    2023-12-05 17:12:09       38 阅读
  2. 简单的文件管理器

    2023-12-05 17:12:09       42 阅读
  3. MFC 读写注册表

    2023-12-05 17:12:09       36 阅读
  4. Python实现人工蜂群算法

    2023-12-05 17:12:09       40 阅读
  5. WebSocket

    2023-12-05 17:12:09       42 阅读
  6. 云原生之深入解析Jenkins多分支管道

    2023-12-05 17:12:09       32 阅读
  7. 电脑耳机和音响怎么同时使用

    2023-12-05 17:12:09       43 阅读