链表倒置算法题的心得

本文探讨了一道编程题目,要求根据给定的K值分段倒置链表。通过分析,作者发现该问题可以通过头插法和堆栈思路解决,并详细解释了如何处理边界和重复倒置问题。在C语言实现过程中,作者还回顾了字符串处理的相关知识,特别是字符数组的初始化和赋值方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

做题的时候碰到了需要倒置线性链表的问题,但是它并不是完全倒置,而是分段倒置。具体题目如下:


Reversing Linked List:

Given a constant KK and a singly linked list LL

you are supposed to reverse the links of every KK elements on LL

For example, given LL being 1→2→3→4→5→6, 

if K = 3K=3, then you must output 3→2→1→6→5→4; 

if K = 4K=4, you must output 4→3→2→1→5→6.


可以看到在倒置中涉及了边界和末尾的问题。

其实说起结点倒置,我第一个就想到了堆栈,节能又简短的数据结构。

后来又一寻思,这其实不就是链表的多次头插法么。

然后又思索了一下,哦,原来堆栈的实现其实也就是头插法。


至于考虑末尾不倒置的问题,则可以完全用

for(int i=Length(L);i>0;i-K){
	for(int j=0;j<K;j++){
		..............
	}
}


来忽略边界值问题

而插头之后的重复倒置问题,则可以用两个临时指针来指向头结点和尾结点。〇为head结点

〇 ->1 ->2 ->3 ->4 ->5 ->6 ->7

假设这个链表的倒置参数K=2,则内部for循环移入新节点步骤:

=====================================================

一:

〇 ->2->3->4->5->6->7

〇->1

二:

〇->3->4->5->6->7

〇->2->1

=====================================================

而外循环的步骤则只要将原本指向头结点的临时指针指向结点1,再重复内循环,以此类推。在外循环结束后,将旧head结点之后的结点连上新节点的尾结点。

最后得出答案:

〇->NULL

〇->2->1->4->3->6->5->7

然后return 新节点。



又由于程序语言用的C语言,所以复习了一遍C语言中对于字符串的处理;

声明过的char数组变量若没有在声明时初始化,则必须用string.h文件中的

strcpy(target,source)函数来进行赋值。相当麻烦哟尴尬

至于字符串数组,则声明起来更是复杂得很。

假设所有字符串最大长度为6,则需要以下步骤:

typedef char ch[7];					//最后一位保存\0
typedef ch* str;					//设置别名

int main(){		
         int count=xxxx;				//决定字符串数组的个数。
         str strings=(str)malloc(sizeof(str)*count);	//分配内存
         strcpy(strings[0],"hello world");		//对数组成员赋值
         return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值