当前所在位置:珠峰网资料 >> 计算机 >> 计算机等级考试 >> 正文
c++实现链表反转
发布时间:2010/6/12 11:33:48 来源:城市学习网 编辑:ziteng
  单向链表的反转是一个经常被问到的一个面试题,也是一个非常基础的问题。比如一个链表是这样的: 1->2->3->4->5 通过反转后成为5->4->3->2->1。
  最容易想到的方法遍历一遍链表,利用一个辅助指针,存储遍历过程中当前指针指向的下一个元素,然后将当前节点元素的指针反转后,利用已经存储的指针往后面继续遍历。源代码如下:
  struct linka {
  int data;
  linka* next;
  };
  void reverse(linka*& head) {
  if(head ==NULL)
  return;
  linka *pre, *cur, *ne;
  pre=head;
  cur=head->next;
  while(cur)
  {
  ne = cur->next;
  cur->next = pre;
  pre = cur;
  cur = ne;
  }
  head->next = NULL;
  head = pre;
  }
  还有一种利用递归的方法。这种方法的基本思想是在反转当前节点之前先调用递归函数反转后续节点。源代码如下。不过这个方法有一个缺点,就是在反转后的最后一个结点会形成一个环,所以必须将函数的返回的节点的next域置为NULL。因为要改变head指针,所以我用了引用。算法的源代码如下:
  linka* reverse(linka* p,linka*& head)
  {
  if(p == NULL || p->next == NULL)
  {
  head=p;
  return p;
  }
  else
  {
  linka* tmp = reverse(p->next,head);
  tmp->next = p;
  return p;
  }
  }
广告合作:400-664-0084 全国热线:400-664-0084
Copyright 2010 - 2017 www.my8848.com 珠峰网 粤ICP备15066211号
珠峰网 版权所有 All Rights Reserved