怎样实现c 实现单链表的合并反转与合并

c++ 实现链表反转
c++ 实现链表反转
  单向链表的反转是一个经常被问到的一个面试题,也是一个非常基础的问题。比如一个链表是这样的: 1-&2-&3-&4-&5 通过反转后成为5-&4-&3-&2-&1。
  最容易想到的方法遍历一遍链表,利用一个辅助指针,存储遍历过程中当前指针指向的下一个元素,然后将当前节点元素的指针反转后,利用已经存储的指针往后面继续遍历。源代码如下:
  struct linka {
  linka*
  void reverse(linka*& head) {
  if(head ==NULL)
  linka *pre, *cur, *
  cur=head-&
  while(cur)
  ne = cur-&
  cur-&next =
  head-&next = NULL;
  head =
  还有一种利用递归的方法。这种方法的基本思想是在反转当前节点之前先调用递归函数反转后续节点。源代码如下。不过这个方法有一个缺点,就是在反转后的最后一个结点会形成一个环,所以必须将函数的返回的节点的next域置为NULL。因为要改变head指针,所以我用了引用。算法的源代码如下:
  linka* reverse(linka* p,linka*& head)
  if(p == NULL || p-&next == NULL)
  head=p;
  linka* tmp = reverse(p-&next,head);
  tmp-&next =
&&&主编推荐
H3C认证Java认证Oracle认证
基础英语软考英语项目管理英语职场英语
.NETPowerBuilderWeb开发游戏开发Perl
二级模拟试题一级模拟试题一级考试经验四级考试资料
港口与航道工程建设工程法规及相关知识建设工程经济考试大纲矿业工程市政公用工程通信与广电工程
操作系统汇编语言计算机系统结构人工智能数据库系统微机与接口
软件测试软件外包系统分析与建模敏捷开发
法律法规历年试题软考英语网络管理员系统架构设计师信息系统监理师
高级通信工程师考试大纲设备环境综合能力
路由技术网络存储无线网络网络设备
CPMP考试prince2认证项目范围管理项目配置管理项目管理案例项目经理项目干系人管理
Powerpoint教程WPS教程
电子政务客户关系管理首席信息官办公自动化大数据
职称考试题目
就业指导签约违约职业测评
招生信息考研政治
网络安全安全设置工具使用手机安全
3DMax教程Flash教程CorelDraw教程Director教程
Dreamwaver教程HTML教程网站策划网站运营Frontpage教程
生物识别传感器物联网传输层物联网前沿技术物联网案例分析
互联网电信IT业界IT生活
Java核心技术J2ME教程
Linux系统管理Linux编程Linux安全AIX教程
Windows系统管理Windows教程Windows网络管理Windows故障
组织运营财务资本
视频播放文件压缩杀毒软件输入法微博
数据库开发Sybase数据库Informix数据库
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&(词条-相关词数量)
(推荐度-词条-相关词数)倒叙输出链表的代码实现(四种方法)--转自博客园
今天面试,被考到倒叙输出链表的方法,我当时用的数组和栈实现的,代码写的不好,回来后网上查资料总结如下,供参考:
 四种方式实现倒序输出
  方法一:借用栈倒序输出链表
  方法二:先翻转链表,再顺序输出
  方法三:递归实现,好方法
  方法四:用数组实现
  方法一:借用栈倒序输出链表
  因为栈是先进后出,把链表中的元素存进栈中,链表前面的元素在栈底,后面的元素在栈顶,链表后面的元素先出栈
  方法二:先翻转链表,再按顺序打印(主要是想自己实现单链表的翻转,这种实现方式破坏了链表的结构,当然再翻转一下就还原了)
  翻转链表的步骤:
  1:将当前节点的next节点指向他以前的前一个节点
  2:当前节点下移一位
  3:如果是最后一个节点,就把它的next节点指向它以前的前一个节点,并推出循环
  方法三:用递归实现
  很诚实的说盗用了别人的思想,真的太妙了,完全能看出你是否真的体会了递归的原理
  正如那位哥们所说,递归就是一个进栈出栈的过程,链表前面的元素先进栈,在栈底,后面的元素后进栈,在栈顶,先出栈,哈哈。
  方法四:借用数组实现
  跟用栈实现的方式差不多,空间复杂度都是O(n)。
  #include &stack&
  #include &string&
  #include &iostream&
  class OutFromEnd
  public:
  typedef struct node1
  node1*
  node1(int d):data(d),next(NULL){}
  OutFromEnd()
  head=cur=new node(-1);
  void add(int data)
  node* tmp=new node(data);
  cur-&next=
  //借用栈倒序输出链表
  //因为栈是先进后出,把链表中的元素存进栈中,链表前面的元素在栈底,后面的元素在栈顶,链表后面的元素先出栈
  void stackMethod()
  if(NULL==head || NULL==head-&next)
  node* tmp=head-&
  stack&int&
  while(tmp!=NULL)
  s.push(tmp-&data);
  tmp=tmp-&
  while(!s.empty())
  cout&&s.top()&&"\t";
  s.pop();
  void reverse()
  if(NULL==head || NULL==head-&next)
  cur=head-&
  node* prev=NULL;
  node* pcur=head-&
  while(pcur!=NULL)
  if(pcur-&next==NULL)
  pcur-&next=
  next=pcur-&
  pcur-&next=
  head-&next=
  node* tmp=head-&
  while(tmp!=NULL)
  cout&&tmp-&data&&"\t";
  tmp=tmp-&
  void print3()
  recursion(head-&next);
  //用递归实现
  //很诚实的说盗用了别人的思想,真的太妙了,完全能看出你是否真的体会了递归的原理
  //正如那位哥们所说,递归就是一个进栈出栈的过程,链表前面的元素先进栈,在栈底,后面的元素后进栈,在栈顶,先出栈,哈哈。。。
  void recursion(node* head)
  if(NULL==head)
  if(head-&next!=NULL)
  recursion(head-&next);
  //如果把这句放在第二个if前面,那就是从头到尾输出链表,曾经的你或许是用while或者用for循环输出链表,现在你又多了一种方式
  cout&&head-&data&&"\t";
  //借用数组实现
  void print4()
  node* tmp=head-&
  int len=0;
  while(tmp!=NULL)
  tmp=tmp-&
  tmp=head-&
  int* A=new int[len] ;
  for(int i=len-1;i&=0;i--)
  A[i]=tmp-&
  tmp=tmp-&
  for(int i=0;i&i++)
  cout&&A[i]&&"\t";
  delete [] A;
  private :
  node *head,*
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。推荐这篇日记的豆列
······

我要回帖

更多关于 c 实现单链表的合并 的文章

 

随机推荐