杨宗德:C语言链表逆序技巧


 杨宗德:C语言链表逆序技巧。学习C语言,一定要认真的了解下C语言链表逆序是怎样解决的,而C语言链表逆序又有怎样的技巧?简单的介绍下:

  遍历链表,
  元素进栈,
  遍历的同时销毁原来的链表。
  元素出栈,
  建立新链表。
  高效的是,
  用指向链表结点指针的指针操作
  直接首尾交换指针值(两两进行)
  一般的是前插法
  实际上根本就不用插入,一次遍历就可以完成了。
  链表的逆序,必将涉及到两个以上指针,一般用三个指针,
  下面是一个人的程序:
  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;
  }
  算法都是一致,但顺序不一样,这直接点明了链表操作的核心——顺序,链表的算法主要难在顺序上。
  逆序操作中,要将一个指针指向前一个节点,中间必然断开,这就需要两个指针指向断开处的一前一后。
  上面两个程序都是这样,不同在于指针移动的位置。