单链表反转(逆置)——(四种方法实现)

这篇具有很好参考价值的文章主要介绍了单链表反转(逆置)——(四种方法实现)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

链表逆置就是把最后一个数据提到最前面,倒数第二个放到第二个……依次类推,直到第一个到最后一个。
由于链表没有下标,所以不能借助下标来实行数据的逆置,要靠空间的转移来完成链表的逆置,这里采用没有头节点的链表来实现逆置。

第一种——头插法

算法思想:逆置链表,初始为空,表中节点从原链表中依次“删除”,再逐个插入逆置链表的表头(即“头插”到逆置链表中),使它成为逆置链表的“新”的第一个结点,如此循环,直至原链表为空。

#include <stdio.h>
#include <stdlib.h>

typedef struct List{
	int data;
	struct List* next;
}LIST;
//表的初始化,不带头节点,
LIST* CreatSlist()
 {
 	LIST* head=NULL;
 	for(int i=5;i>=1;i--)
 	{
	LIST* newhead=(LIST *)malloc(sizeof(LIST));
	newhead->data=i;
 	newhead->next=head;
 	head=newhead;
	}
	return head;
}
//打印输出 
void print(LIST* P)
{
	while(P!=NULL)
	{
		printf("%d ",P->data);
		P=P->next;
	}
	printf("\n");
	return; 
}
//单链表反转(头插法) 
LIST* reverse(LIST* head)
{
	LIST *temp=NULL,*Phead=NULL; 
	while(head!=NULL)
	{
		temp=head;
		head=head->next;
		temp->next=Phead;
		Phead=temp;
	}
	return Phead; 
 } 
 
int main ()
{
	printf("原来的链表的数据:\n"); 
	LIST* P=CreatSlist();
	print(P);
	printf("反转后链表的数据:\n"); 
	LIST* head=reverse(P);
	print(head);		
	return 0;
 } 

结果如下:

单链表反转(逆置)——(四种方法实现)

 第二种——递归

算法思想:先假定有一个函数,可以将以head为头结点的单链表逆序,并返回新的头结点。利用这个函数对问题进行求解:将链表分为当前表头结点和其余部分,递归的过程就是,先将表头结点从链表中拆出来,然后对其余部分进行逆序,最后将当前的表头结点链接到逆序链表的尾部。递归的终止条件就是链表只剩一个节点时,直接返回这个节点

#include <stdio.h>
#include <stdlib.h>

typedef struct List{
	int data;
	struct List* next;
}LIST;
//表的初始化,不带头节点,
LIST* CreatSlist()
 {
 	LIST* head=NULL;
 	for(int i=5;i>=1;i--)
 	{
	LIST* newhead=(LIST *)malloc(sizeof(LIST));
	newhead->data=i;
 	newhead->next=head;
 	head=newhead;
	}
	return head;
}
//打印输出 
void print(LIST* P)
{
	while(P!=NULL)
	{
		printf("%d ",P->data);
		P=P->next;
	}
	printf("\n");
	return; 
}
//单链表反转(递归法) 
LIST* reverse(LIST* head)
{
	if(head==NULL||head->next==NULL)
	return head;
	LIST  *new_head=reverse(head->next);
	head->next->next=head;
	head->next=NULL;	
	return new_head; 
 } 
 
int main ()
{
	printf("原来的链表的数据:\n"); 
	LIST* P=CreatSlist();
	print(P);
	printf("反转后链表的数据:\n"); 
	LIST* head=reverse(P);
	print(head);	
	return 0;
 }

结果如下:

单链表反转(逆置)——(四种方法实现)

 第三种——迭代法

算法思想:链表迭代逆置的时候需要借助三个指针,这里我们把三个指针定义为p1,p2,p3.然后让这三个指针迭代更新。

#include <stdio.h>
#include <stdlib.h>

typedef struct List{
	int data;
	struct List* next;
}LIST;
//表的初始化,不带头节点,
LIST* CreatSlist()
 {
 	LIST* head=NULL;
 	for(int i=5;i>=1;i--)
 	{
	LIST* newhead=(LIST *)malloc(sizeof(LIST));
	newhead->data=i;
 	newhead->next=head;
 	head=newhead;
	}
	return head;
}
//打印输出 
void print(LIST* P)
{
	while(P!=NULL)
	{
		printf("%d ",P->data);
		P=P->next;
	}
	printf("\n");
	return; 
}
//单链表反转(迭代反转) 
LIST* reverse(LIST* head)
{
	LIST *p1=NULL,*p2=NULL,*p3=NULL;
	p1=head;
	p2=p1->next;
	while(p2!=NULL)
	{
	p3=p2->next;
	p2->next=p1;
	p1=p2;
	p2=p3;
	}
	head->next=NULL;
	head=p1;
	p1=NULL;
	return head; 
 } 
 
int main ()
{
	printf("原来的链表的数据:\n"); 
	LIST* P=CreatSlist();
	print(P);
	printf("反转后链表的数据:\n"); 
	LIST* head=reverse(P);
	print(head);		
	return 0;
 } 

结果如下:

单链表反转(逆置)——(四种方法实现)

 第四种——就地逆置

算法思想:就地逆置法和头插法的实现思想类似,唯一的区别在于,头插法是通过建立一个新链表实现的,而就地逆置法则是直接对原链表做修改,从而实现将原链表反转。在原链表的基础上做修改,需要额外借助 2 个指针(假设分别为 p和 q)。

#include <stdio.h>
#include <stdlib.h>

typedef struct List{
	int data;
	struct List* next;
}LIST;
//表的初始化,不带头节点,
LIST* CreatSlist()
 {
 	LIST* head=NULL;
 	for(int i=5;i>=1;i--)
 	{
	LIST* newhead=(LIST *)malloc(sizeof(LIST));
	newhead->data=i;
 	newhead->next=head;
 	head=newhead;
	}
	return head;
}
//打印输出 
void print(LIST* P)
{
	while(P!=NULL)
	{
		printf("%d ",P->data);
		P=P->next;
	}
	printf("\n");
	return; 
}
//单链表反转(就地逆置) 
LIST* reverse(LIST* head)
{
	LIST *p=NULL,*q=NULL; 
	p=head;
	q=head->next;
	while(q!=NULL)
	{
		p->next=q->next;
		q->next=head;;
		head=q;
		q=p->next; 
	}
	p=NULL;
	return head; 
 } 
 
int main ()
{
	printf("原来的链表的数据:\n"); 
	LIST* P=CreatSlist();
	print(P);
	printf("反转后链表的数据:\n"); 
	LIST* head=reverse(P);
	print(head);		
	return 0;
 } 

结果如下:

单链表反转(逆置)——(四种方法实现)

 文章来源地址https://www.toymoban.com/news/detail-508546.html

 

到了这里,关于单链表反转(逆置)——(四种方法实现)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构】--单链表力扣面试题②反转链表

    目录 题目链接:反转链表   法一:直接反转法 法二:头插法 题目分析: 创建一个新链表,然后值是逆置的行吗?不行。因为题目要求的是在 原链表上逆置,改变原链表的指向,并不是值的拷贝后的逆转 。 那其实总共有三种方法 。 法一,直接原地翻转。法二,头插法。

    2024年02月06日
    浏览(27)
  • 单链表的逆置

    1 问题 如何实现单链表中的数据进行逆置。 2 方法 方法一头插法:利用头插法重新建立带节点的新链表,逆置链表初始为空,表中节点从原链表中依此“删除”,在逐个插入逆置链表的表头(即“头插”到逆置链表中),使它成为逆置链表的“新”的第一个节点,如此循环,

    2024年02月15日
    浏览(21)
  • 四种创建单链表的方法

    学习了这么久的数据结构,终于把链表吃透啦,下面是我整理的四种创建单链表的的方法 以及一些非常容易犯的错误,让我们一起来看看吧~ 目录 一、单链表的分类 二、单链表的初始化 2.1 初始化不带头结点的单链表 2.2 初始化带头结点的单链表 三、单链表的创建 3.1 创建不

    2024年02月08日
    浏览(30)
  • Java实现反转单链表

    反转单链表是一个常见的编程问题,可以使用迭代或递归的方式来实现。下面分别给出这两种方式的Java代码实现: 使用迭代方式实现反转单链表: 使用递归方式实现反转单链表: 无论是迭代还是递归,反转单链表的思路都是将当前节点的指针指向前一个节点,从而实现链表

    2024年02月15日
    浏览(26)
  • 数据结构(C语言):将单链表就地逆置

    设计一个算法,实现将头结点为head的单链表就地逆置 ,即利用原带头结点单链表head的结点空间将数据元素序列(a0,a1,…,an-1)逆置为(an-1,…, a1,a0)。 本题所使用的数据结构定义如下: 单链表的数据结构定义: 1 、若单链表为空表或单链表中只有一个元素,则无需进行逆置

    2024年02月08日
    浏览(27)
  • 数据算法之反转链表(五种方法)

    题目描述 : 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例: 输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1] 提示代码: 这道题来自力扣的第206题,今天我们尝试使用五种不同的方法来实现链表的反转。 第一种方法也是最容易想到的方法,就是将我们链表中的

    2024年02月03日
    浏览(26)
  • Java 算法篇-深入了解单链表的反转(实现:用 5 种方式来具体实现)

    🔥博客主页:  小扳_-CSDN博客 ❤感谢大家点赞👍收藏⭐评论✍          文章目录         1.0 单链表的反转说明         2.0 单链表的创建         3.0 实现单链表反转的五种方法         3.1 实现单链表反转 - 循环复制(迭代法)         3.2 实现单链表反转 - 头插法

    2024年02月05日
    浏览(31)
  • 反转链表(递归实现)

    递归反转整个链表 题目 :力扣206 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 思路:递归到最后一个节点并返回,然后修改next指针。 反转前n个链表 题目:将链表的前n个节点反转。 思路:和反转整个链表思路一样,只需要注意第n个节点的下一个节点

    2024年02月13日
    浏览(32)
  • Java 实现反转一个链表

    翻转指的是改变链表中结点的指向,而不是将它的数据反转。 上图展示出的就是一个反转前的链表,下图展示一个反转后的链表。 根据上图可以看出,结点的地址和数据都没有改变,改变的只是链表结点的指向,更改后的头结点变成了尾结点。 首先要定义一个 cur 变量,让

    2024年02月11日
    浏览(36)
  • 206. 反转链表、Leetcode的Python实现

    博客主页:🏆 看看是李XX还是李歘歘  🏆 🌺每天分享一些包括但不限于计算机基础、算法等相关的知识点🌺 💗 点关注不迷路,总有一些📖知识点📖是你想要的 💗 ⛽️今天的内容是      Leetcode    206. 反转链表     ⛽️💻💻💻 206. 反转链表 给你单链表的头节点 

    2024年02月06日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包