简洁的做法是
  遍历链表
,  元素进栈
,  遍历的同时销毁原来的链表
。  元素出栈,
  建立新链表
。  高效的是,
  用指向链表结点指针的指针操作
  直接首尾交换指针值(两两进行)
  一般的是前插法
  实际上根本就不用插入,一次遍历就可以完成了。
  链表的逆序,必将涉及到两个以上指针,一般用三个指针,
  下面是一个人的程序:
  struct List1 *reverse(List1 *h) //h为链表的头指针
  {
  struct List1 *p,*v1,*v2;
  v2=h;
  v1=NULL;
  while( v2!=NULL ){
  p=v2->pNext;
  v2->pNext=v1;
  v1=v2;
  v2=p;
  }
  return v1;
  }
  另一个人的:
  struct IntNode* res(struct IntNode* h)
  {
  struct IntNode *s, *s1;
  s = h;
  h = NULL;
  while (s)
  {
  s1 = s;
  s = s->next;
  s1->next = h;
  h = s1;
  }
  return h;
  }
  算法都是一致,但顺序不一样,这直接点明了链表操作的核心——顺序,链表的算法主要难在顺序上。
  逆序操作中,要将一个指针指向前一个节点,中间必然断开,这就需要两个指针指向断开处的一前一后。
  上面两个程序都是这样,不同在于指针移动的位置。