现在的位置: 首页 > 综合 > 正文

关于链表的逆序排列!

2012年10月13日 ⁄ 综合 ⁄ 共 1307字 ⁄ 字号 评论关闭

 

关于链表逆序的中心思想就是:
 用三个结点指针分别记录,第一个和第二个结点,把第一个结点后指为NULL,由首结点作为尾结点。然后把第二个指向第一个,再然后同

时移动,使第二个结点为第三个结点,第一个结点为第二个结点。就这样依次串连就得到一个逆序的链表了。呵呵,以前我没想到这个方法时,自己

想了个超级笨的,就是遍历出结点的个数,然后用个双重循环不停的找到最后一个结点然后串连,用的是顺序表的思想,实在是愚笨啊,呵呵,思想

差不多就这样,搞不懂就自己画图表示,下面结合代码:

#include <stdio.h>
 struct Node
 {
  int data;
  struct Node *next;
 };
 
 typedef struct Node Node;
 Node * converse(Node *_head); //逆序的函数 
 
 int main()
 {
  Node a,b,c,d;   //为方便演示创建一个简单链表 
  Node *head,*current;
  a.data=1;
  a.next=&b;
  b.data=2;
  b.next=&c;
  c.data=3;
  c.next=&d;
  d.data=4;
  d.next=NULL;
  head = &a;
  
  current=head;  //为方便演示创建一个简单链表 
  
  while(current!=NULL)
  {
   printf("the value is %d\n",current->data);
   current=current->next;
  }      //输出逆序前的链表 
  head=converse(head);
  printf("the converse order is :\n");
  current=head;
  
  while(current != NULL)
  {
   printf("the value is :%d\n",current->data);
   current=current->next;
  }     //输出逆序后的链表 
 
  
  return 0;
 }
 
 Node * converse(Node *_head)
 {
  Node *current1,*current2,*current3,*head;
  
  head=_head;
  if(head == NULL)
   return NULL;    //如果链表为空则返回空 
 else if(head->next==NULL)
  return head;    //如果只有一个结点则返回 
 current1=head->next;    //找到第二个结点 
 current2=head->next;    //同样指向第二个结点 
 current3=head;     //指向head结点也就是第一个结点 
 current3->next=NULL;    //把第一个结点为最后一个,指向NULL 
  while(current1->next!=NULL)
  {
   current1=current1->next;  //找到后一个结点 
   current2->next=current3;  //把第二个结点后指第一个结点 
   current3=current2;   //然后把尾结点往前移动到第二个结点 
   current2=current1;   //同样后移到第三个结点 
  }
  current2->next=current3;
  head=current2;    //返回逆序后的结点 
  return head;
 }

注意:此为不带头的链表哦!

抱歉!评论已关闭.