C语言链表逆序技巧

来源:网络时间:2011-06-24

  简洁的做法是

  遍历链表,

  元素进栈,

  遍历的同时销毁原来的链表。

  元素出栈,

  建立新链表。

  高效的是,

  用指向链表结点指针的指针操作

  直接首尾交换指针值(两两进行)

  一般的是前插法

  实际上根本就不用插入,一次遍历就可以完成了。

  链表的逆序,必将涉及到两个以上指针,一般用三个指针,

  下面是一个人的程序:

  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;

  }

  算法都是一致,但顺序不一样,这直接点明了链表操作的核心——顺序,链表的算法主要难在顺序上。

  逆序操作中,要将一个指针指向前一个节点,中间必然断开,这就需要两个指针指向断开处的一前一后。

  上面两个程序都是这样,不同在于指针移动的位置。

发表评论

最新评论(共5条)

2345市网友

非常感谢,终于看明白了!

2012-08-06 0

回复@2345网友:

  • 取消

2345市网友

简明扼要,尤其最后那句逆序操作中,要将一个指针指向前一个节点,中间必然断开,这就需要两个指针指向断开处的一前一后。醍醐灌顶啊!!!

2012-04-18 0

回复@2345网友:

  • 取消

2345市网友

现在学的数据结构,不会编程,一点也不会啊,想赶紧补上。。

2012-04-05 0

回复@2345网友:

  • 取消

2345市网友

全局变量和局部变量

2012-03-09 0

回复@2345网友:

  • 取消

2345市网友

get it!

2011-09-05 1

回复@2345网友:

  • 取消