小白算法积累——单链表11#带头结点单链表 +分解+逆序

蓝咒 提交于 2020-02-19 11:36:33

题目:设C={a1,b1,a2,b2,…an,bn}为线性表,采用带头结点的hc单链表存放,
设计一个就地算法,将其拆分为两个线性表,
使得A={a1,a2,…an},B={bn,bn-1,…b2,b1}
关键字:带头结点单链表 +分解+逆序

思路1
采用第10题的思路,借助访问序号小助手

思路2
不使用序号小助手
while循环中的代码改为将结点插入到表A中并将下一个结点插入到B中,
然后逐步循环这个操作,one for A,one for B ||one for A,one for B ||…

另外,由于B是逆置,所以使用头插法
需要变量:
A,B表头结点指针:A,B
A表(旧表)的工作指针p,尾指针ra (执行尾插法),后继指针q(防断链)

LinkList DisCreat_2(LinkList & A){
  LinkList B=(LinkList)malloc(sizeof(LNode));//创建B表表头
  B->next=NULL;//初始化B表
  LNode*p=A->next,*q;//p为工作指针,q为
  LNode*ra=A;//ra为表尾指针,始终指向A的尾结点
  while(p!=NULL){
    ra->next=p;ra=p;//ra作为尾指针,负责将每次断裂的A表链接会去
    p=p->next;//p遍历原来A表
    if(p!=NULL)
      q=p->next;//q是原来A表中的后继结点,负责防止断链,这一步必须在把当前结点链给B表之前做
    p->next=B->next;//头插法构造B表
    B->next=p;//
    p=q;//p回到A表
  }
 ra->next=NULL;//rb->next=NULL可以省略,因为B表是头插法,一开始的b1已经设置了指向null
 return B;
 }
      
      


  
  }
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!