C语言两种方法实现单链表反转

单链表的反转是较为常见的操作,通常用迭代法和递归法来实现

  • 迭代法
  • 递归法

一.迭代法

迭代:重复执行程序中的循环指令直至达到某条件

1.初始定义变量:

首先定义两个指针,让cur指向头指针,pre指向NULL;

2.程序运行原理:

a.因为在迭代的过程中cur->next会被修改,所以先用中间变量temp储存,以便后面cur指针再往前一位;

 temp=now->next;

b.将cur->next储存后,让cur->next指向上一个数值,这样就实现了链表单个节点的反转;

	cur->next=pre;

c. 将进行迭代的两个指针全部向后移动一位,以便进行下一次迭代;

​    pre=cur;
	cur=temp;

3.迭代过程:

cur指针和pre指针不断向后移动,当循环结束时,完成整个链表的反转,此时pre指针指向最后一个数据,cur指针指向NULL,所以返回cur指针的值

    return cur;

4.完整代码:

#include <stdio.h>
#include <stdlib.h>
typedef struct nodef
{
	int data;
	struct nodef *next;
} *linklist;
linklist backward_1(linklist head)
{
	linklist pre=NULL,cur=head;
	linklist temp;
	while(cur)
	{
		
		temp=now->next;
		cur->next=pre;
		pre=cur;
		cur=temp;
	}
	return pre;
}

二.递归法

1.首先设置递归结束的条件;

if(head->next==NULL)
	{
	 	return head;
	 } 

2.开始递归

不断调用自身函数并不断传入下一个节点的地址,当压顶的函数参数指向NULL时函数从栈顶开始释放,下面每个函数的指针把下一个节点的next指向自己同时让当前的next指向空,实现链表反转,直到执行第一个函数的代码返回头指针head。

​	linklist temp=backward_2(head->next);
	head->next->next=head;
	head->next=NULL; 
	return temp;

3.完整代码:

#include <stdio.h>
#include <stdlib.h>
typedef struct nodef
{
	int data;
	struct nodef *next;
} *linklist;
linklist backward_2(linklist head)//递归法 
{
	if(head->next==NULL)
	{
	 	return head;//递归结束 
	 } 
	linklist temp=backward_2(head->next);
	head->next->next=head;
	head->next=NULL; 
	return temp;
}

完整代码实现:

#include <stdio.h>
#include <stdlib.h>
typedef struct nodef
{
	int data;
	struct nodef *next;
} *linklist;
linklist nailcreate(int n,linklist head)
{
	int i;
	linklist p,end,node;
	p=head;
	for(i=0;i<n;i++)
	{
		node=(linklist)malloc(sizeof(linklist));
		//node->next=NULL;
		p->next=node;
		scanf("%d",&node->data);	
		p=node;
	}
	node->next=NULL;
	return head;
}//尾插法创建链表 
linklist backward_1(linklist head)//迭代法 
{
	linklist pre=NULL,cur=head;
	linklist temp;
	while(cur)
	{
		
		temp=cur->next;//临时储存 
		cur->next=pre;
		pre=cur;
		cur=temp;
	}
	return pre;
}
linklist backward_2(linklist head)//递归法 
{
	if(head->next==NULL)
	{
	 	return head;//递归结束 
	 } 
	linklist temp=backward_2(head->next);
	head->next->next=head;
	head->next=NULL; 
	return temp;
}
void output(linklist head)
{
	linklist p;
	p=head;
	while(p)
	{
	printf("%d ",p->data);
	p=p->next ;
	}
}//输出 
int main()
{
	linklist head;
	int n; 
	head=(linklist)malloc(sizeof(linklist));
	head->next=NULL;//链表初始化 
	printf("请输入链表长度:");
	scanf("%d",&n);//输入链表长度 
	printf("请输入链表:"); 
	nailcreate(n,head);
	head=head->next;
	head=backward_1(head);//迭代法 
//	head=backward_2(head);//递归法 
	printf("反转后的链表为:");
	output(head);
	return 0;
}

运行结果:

在这里插入图片描述


感谢指正!

  • 11
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是链表反转C语言实现代码: ```c #include<stdio.h> #include<stdlib.h> struct ListNode { int val; struct ListNode *next; }; struct ListNode* reverseList(struct ListNode* head) { struct ListNode* prev = NULL; struct ListNode* curr = head; while (curr != NULL) { struct ListNode* nextTemp = curr->next; curr->next = prev; prev = curr; curr = nextTemp; } return prev; } int main() { struct ListNode* head = (struct ListNode*)malloc(sizeof(struct ListNode)); head->val = 1; head->next = (struct ListNode*)malloc(sizeof(struct ListNode)); head->next->val = 2; head->next->next = (struct ListNode*)malloc(sizeof(struct ListNode)); head->next->next->val = 3; head->next->next->next = NULL; struct ListNode* new_head = reverseList(head); while (new_head != NULL) { printf("%d ", new_head->val); new_head = new_head->next; } return 0; } ``` 这段代码中,我们首先定义了一个 `ListNode` 结构体,表示链表的节点。其中,`val` 表示节点的值,`next` 表示指向下一个节点的指针。接着,我们定义了 `reverseList` 函数,用于反转链表。在函数中,我们使用了三个指针变量 `prev`、`curr` 和 `nextTemp`,分别表示当前节点的前一个节点、当前节点和当前节点的后一个节点。在循环中,我们不断地将当前节点的 `next` 指针指向前一个节点,然后更新三个指针变量的值,直到当前节点为 `NULL`。最后,我们返回反转后的链表的头指针 `prev`。在 `main` 函数中,我们构造一个简链表,并且调用 `reverseList` 函数进行反转,最后输出反转后的链表的节点值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值