`

单链表的就地逆置

 
阅读更多

分析:
  可以用交换数据的方式来达到逆置的目的。但是由于是单链表,数据的存取不是随机的,因此算法效率太低。可以利用指针改指来达到表逆置的目的。具体情况入下:
  (1)当链表为空表或只有一个结点时,该链表的逆置链表与原表相同。
  (2)当链表含2个以上结点时,可将该链表处理成只含第一结点的带头结点链表和一个无头结点的包含该链表剩余结点的链表。然后,将该无头结点链表中的所有结点顺着链表指针,由前往后将每个结点依次从无头结点链表中摘下,作为第一个结点插入到带头结点链表中。这样就可以得到逆置的链表。算法是这样的:
  结点结构定义如下:
    typedef char DataType; //假设结点的数据域类型的字符
    typedef struct node{ //结点类型定义
      DataType data; //结点的数据域
      struct node *next;//结点的指针域
     }ListNode;
    typedef ListNode *LinkList;
    ListNode *p;
    LinkList head;

  LinkList ReverseList( LinkList head )
   {// 将head 所指的单链表(带头结点)逆置
    ListNode *p ,*q ;//设置两个临时指针变量
    if( head->next && head->next->next)
     { //当链表不是空表或单结点时
      p=head->next;
      q=p->next;
      p -> next=NULL; //将开始结点变成终端结点

      while (q)
       { //每次循环将后一个结点变成开始结点 
        p=q;
        q=q->next ;
        p->next = head-> next ;
        head->next = p;
       }
      return head;
     }
    return head; //如是空表或单结点表,直接返回head
   }

---------------

另解:(比较费解)

void  Inverse(LinkList L)   // 费解;
     {
      LNode *p,*q,*s;
      p=L->next;
      if(p&&p->next)
       {
        q=p->next;
        p->next=NULL;
       }
      while(q)
      {
       s=q->next;
       q->next=p;
       p=q;q=s;
       }
     L->next=p;
     
     }  

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics