假设线性表(a1,a2,a3,…an)采用不带头结点的单链表存储,请设计算法函数linklist reverse1(linklist head)和
void reverse2(linklist *head)将不带头结点的单链表head就地倒置,使表变成(an,an-1,…a3.a2,a1)。并构造测试用例进行测试。
- #include "slnklist.h"
-
- linklist reverse1(linklist head)
- {
- linklist newH,q,p;
- p=head;
- newH=NULL;
- while(p!=NULL){
- q=p; p=p->next;
- q->next=newH;
- newH=q;
- }
- return newH;
- }
- void reverse2(linklist *head)
- {
- linklist p=NULL,q=*head;
- while(q!=NULL){
- *head=q->next;
- q->next=p;
- p=q;
- q=*head;
- }
- *head=p;
- }
-
- int main()
- { datatype x;
- linklist head;
- head=creatbystack();
- print(head);
- head= reverse1(head);
- print(head);
- reverse2(&head);
- print(head);
- delList(head);
- return 0;
- }
原文http://blog.youkuaiyun.com/wlxsq/article/details/50394243
其中涉及到的头插法,可以看http://www.cnblogs.com/zhuzhenfeng/p/4626539.html,
对p=p->next的指向还是模模糊糊:https://zhidao.baidu.com/question/46794566.html
p->next只不过是获取p这个节点的next域
只有p=p->next,这种方式才是让p指向了下一个节点
q->next=p;p->next=null;q=p;
这个里面的q指向的永远是是要在当前节点添加下一个节点的哪个节点
假设 q现在指的是1节点,执行q->next=p,就是在1节点后面添加了个节点2
p->next=null,就是把2节点的next域设置为null;
q=p 就是把2节点地址给q,现在q就是指的是2节点了;如果把它这3个语句放在个循环里面就能构造个单链表了
因为 “先申请产生一个头结点” 其实就是建立一个带头结点的 空 单链表,而一个带头结点的 空 单链表,其头结点也就是尾结点。因此,以后插入新结点(p)就简单了:
p->next = (*L)->next;
(*L)->next = p; //插入到表头 摘自L:https://zhidao.baidu.com/question/1303039018443459019.html