双向链表和单向链表的原地逆置(反向) 头插法 C语言

  1. 双链表的逆置(头插法)

有头结点(图中红色的结点)

原理依次将原链表中的结点用头插法插入到:没有头结点的,头指针为h的新链表中。最后再将新链表接到原来的头结点后面,返回原来的头指针L ,如下图所示:

双向链表和单向链表的原地逆置(反向) 头插法 C语言_第1张图片
双向链表和单向链表的原地逆置(反向) 头插法 C语言_第2张图片
双向链表和单向链表的原地逆置(反向) 头插法 C语言_第3张图片


typedef struct LNode
{
    char data[20];
    struct LNode *prior, *next;
} LNode, *LinkList;

/* 依次将原链表中的结点用头插法插入到:没有头结点的,头指针为h的新链表中,
最后再将新链表接到原来的头结点后面,返回原来的头指针L
*/
LinkList reverse( LinkList L)
{
    /*
        p用来指向原链表中的第一个结点,待链入新链表头的结点
        r用来指向原链表中的第二个结点
        h用来指向新链表中的第一个结点
    */
  LNode *p,*r,*h;

  h=L->next;/*h用来指向链表的第一个结点*/
  if(h && h->next)
  {
    p=h;
    r=p->next;/*r指向p的下一个结点*/
    p->next=NULL;/*让p的下一个结点为NULL*/
  while(r)
  {
    p=r;/*p指向r结点*/
    r=r->next;/*r继续指向下一个结点*/
    p->next=h;/*p的后继指向链表的第一个结点h*/
    h->prior=p;/*链表的第一各结点h的前驱指向p*/
    h=p;/*p链入链表后,p就成为了链表的第一个结点*/
  }
  L->next=h;/*头结点L的后继指向新链表的第一个结点h*/
  h->prior=L;/*新链表的第一结点h的前驱指向头结点L*/
  return L;
  }
}

  1. 单链表的逆置(头插法)

有头结点

原理将头结点摘下,然后从第一个节点开始,依次插入到头结点的后面,直到最后一个结点为止,这样就实现了单链表的逆置,如下图所示:

双向链表和单向链表的原地逆置(反向) 头插法 C语言_第4张图片

LinkList Reverse(LinkList L)
{
    LNode *p, *r;
    p=L->next;
    L->next=NULL;
    while(p!=NULL)
    {
        r=p->next;
        p->next=L->next;
        L->next=p;
        p=r;
    }
    return L;
}

你可能感兴趣的:(数据结构,链表,算法)