做题的时候碰到了需要倒置线性链表的问题,但是它并不是完全倒置,而是分段倒置。具体题目如下:
Reversing Linked List:
Given a constant K and a singly linked list L,
you are supposed to reverse the links of every K elements on L.
For example, given L being 1→2→3→4→5→6,
if K=3, then you must output 3→2→1→6→5→4;
if K=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;
}