单链表的就地逆置.

  分析:
  可以用交换数据的方式来达到逆置的目的。但是由于是单链表,数据的存取不是随机的,因此算法效率太低。可以利用指针改指来达到表逆置的目的。具体情况入下:
  (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;
     
     }  

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值