反转单链表

文章介绍了如何反转单链表,提供了两种方法:一是利用两个动态指针逐个反转节点;二是采用头插法创建新链表。每种方法都详细阐述了操作步骤,并给出了相应的函数代码实现。
摘要由CSDN通过智能技术生成

目录

题目

做法1:利用两个动态指针反转箭头

做法2:头插法


题目

给出一个单链表头节点,请你返回该链表反转后的新头节点;

例如:

处理前链表状态:  a-> b-> c-> d-> e->f;
提供a地址;
处理完后链表状态:f-> e-> d-> c-> b-> a;
返回f的地址;

做法1:利用两个动态指针反转箭头

利用两个动态指针,逐个反转节点

先定义两个指针:

node *pre=NULL;

node *cur=head;

因为最后的状态是头节点在链表末尾,所以在反转时,头节点前应该指向NULL;

状态1如下:

进行操作如下:

 ①将cur节点next指向pre节点

②再让pre指针指向cur节点

③cur指针往前走一步 

//在③之前,cur节点的next指针已经改变,所以要创建一个临时指针,在cur节点next指针改变前要保存cur节点的下一位节点。

 重复①②③操作n次,即遍历n个节点,逐个反转。

当cur指向NULL时,说明当前已经反转完了所有节点。

函数代码:

//函数只返回头节点地址

//调用方式list=reversal(list);

node* reversal(node* head){
	node *pre=NULL;//保存前结点的指针 
	node *cur=head;//当前修改位置的指针 
	while(cur){
		node* temp=cur->next;
		cur->next=pre;
		pre=cur;
		cur=temp;
	}
	return pre;
}

做法2:头插法

创建一个新头节点,将链表头节点断开再从新链表头位置插入;类似队列

定义一个指针指向新链表的头节点,刚开始为空;

再定义一个指针,操作当前节点,刚开始指向链表头节点;

node *head_new=NULL;
node *cur=head;

初始状态如下:接着

 ①cur节点的next指针指向head_new节点

②更新head_new,即更新头节点指针

③cur继续走一步

//在③之前,cur节点的next指针已经改变,所以要创建一个临时指针,在cur节点next指针改变前要保存cur节点的下一位节点。

进行完一次①②③操作后的状态如下:

进行完两次①②③操作后的状态如下:

执行n次①②③操作,即将n个节点逐次插入到新链表

当cur指向NULL时,说明当前已经插入完了所有节点。

函数代码:

//函数只返回头节点地址

//调用方式list=reversal(list);

node* reversal(node* head){
	node* head_new=NULL;
	node* cur=head;
	while(cur){
		node *temp=cur->next;//保存cur的下一节点 
		cur->next=head_new;//从新链表头节点前插入节点 
		head_new=cur;//更新新链表的头节点 
		cur=temp;//cur向前走一步 
	}
	return head_new; 
}

ps:

练习这道题目,便于熟悉链表操作的规则,更帮助理解链表结构。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值