链表倒置算法题的心得

来源:互联网 发布:农村淘宝视频 编辑:程序博客网 时间:2024/05/17 23:53

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


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];//最后一位保存\0typedef ch* str;//设置别名int main(){         int count=xxxx;//决定字符串数组的个数。         str strings=(str)malloc(sizeof(str)*count);//分配内存         strcpy(strings[0],"hello world");//对数组成员赋值         return 0;}


0 0