俺给你的那个程序本来就能用啊,只是临界区忘记初始化了哈。
把初始化函数改一下即可。
NodeList(){
mHead=NULL;
mName[0]='\0';
InitializeCriticalSection(&g_cs);
}假设现在有个酱紫的链表
1 --> 2 --> 3
链表逆置之后变成:
1 <-- 2 <-- 3注意,下面的内容中 next表示结构体中下一个节点的地址
哈~
下面是步骤:
1、保存上一节点的地址LAST(一开始的时候因为没有上一节点,所以L = NULL)
2、保存当前节点的地址NOW(一开始的时候是1的地址)
3、保存下一节点的地址NEXT(一开始的时候是1的下一节点的地址,即2的地址)
4、NEXT = NOW->next(保存下一节点的地址到NEXT)
5、NOW->next = LAST(断开 1 --> 2 的箭头,此时变成 1 2 --> 3)
6、LAST = NOW (把当前节点地址保存到LAST)
7、NOW = NEXT (移动到下一个节点)
8、NEXT = NOW->next(记录下一个节点的地址到NEXT)
9、NOW->next = LAST(断开 2 --> 3 的箭头,并建立 2 --> 1,因为LAST存的是1的地址)
10、LAST = NOW(把当前节点地址保存到LAST)
11、NOW = NEXT(移动到下一节点)
12、NEXT = NOW->next(记录下一个节点的地址到NEXT)
13、NOW->next = LAST(建立 3 --> 2,因为LAST存的是2的地址)
14、LAST = NOW(把当前节点地址保存到LAST)
发现没有,步骤其实是重复的!
重复的步骤就可以建立循环来解决咯~
那循环条件是什么呢?
想一下什么时候循环:当前节点滞后还有节点的时候就循环
所以循环条件就是当前节点的next指针不为NULL,不为NULL的时候,就表示后面还有节点!
以上是单链表的逆置~建议在步骤部分画个图,把每一步的NEXT、NOW、LAST的值都写一下。
回答完毕~~
唔转换成双向链表不会?
其实差不多,也是记录NOW、NEXT、LAST三个值
双向链表与单向链表的区别就只是多了一个指向前一个节点的指针(假设是last)。
在遍历整个链表的时候只要 NOW->last = LAST 加一句这个就好了
node xNode = new node;
xNode->value = x;
xNode->next = a->next;
xNode->pre = b->pre;
a->next = xNode;
b->pre = xNode;
个人理解应该是1,000,000,000,000。每三个零一个逗号。 构建一个双向链表,每个链表的节点表示一个3位整数。 从输入的字符或字符串生成链表时,可以先把1作为头节点加入,然后把000加入到下一节点,依次类推。 两个输入的长整数分别用2个链表来表示。 加法运算时,从尾部节点开始运算,两个链表的同一个位置上两个3位整数相加,如果需要进位就带入下一节点。输出可以新生成链表,输出再从头部输出,每三位一个逗号。
评论列表(0条)