链表逆序

1、链表结构:

2、分析:

  1. 若链表为空或者只有一个节点,则直接返回
  2. 设置两个前后相邻的指针p,q。将p所指向的节点作为q指向节点的后继
  3. 重复2直到q为空
  4. 调整立案表头和链表尾

3、图例:逆序A-B-C-D,

初始状态:p=head->next,q=p->next,t=null

循环:

while(q)

{

  r=q->next;  //主要是保护好q的后继节点

  q->next=p;  //将q的后继节点指向p

  p=q;  //p向后移动

  q=t;  //q向后移动

}

4.程序实现:

#include <stdlib.h>
#include <iostream.h>
#include <stdio.h>

typedef struct node
{
int data;
struct node *next;
}node,*LinkList;

void PrintList(LinkList L);
void reverseList(LinkList L);
void createList(LinkList L,int n);

main()
{
LinkList L;
L=(LinkList)malloc(sizeof(node));
int n=10;
createList(L,n);

cout<<"原始链表:"<<endl;
PrintList(L);
reverseList(L);

cout<<"逆序后链表:"<<endl;
PrintList(L);
return 0;
}

//创建一个链表,从尾部插入新节点
void createList(LinkList L,int n)
{
LinkList p;
LinkList r;
int i;
//L=(LinkList)malloc(sizeof(node));
r=L; //r指向链表尾部节点
for(i=1;i<=n;i++)
{
p=(LinkList)malloc(sizeof(node));
p->data=i;
p->next=NULL;
r->next=p;
r=p;
}
//r->next=NULL;
}

//打印链表
void PrintList(LinkList L)
{
LinkList p;
p=L->next;
//p=L;
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}

//链表的逆序
void reverseList(LinkList L)
{
LinkList p,q,r;
p=L->next; //p指向L的第一个节点
q=p->next; //q指向p指向节点的下一个节点
r=NULL; //r先指向一个空节点
while(q!=NULL)
{
r=q->next; //保护q的后继节点
q->next=p; //改变前驱和后继
p=q; //向后移
q=r; //
}
//此时q为NULL,p是原链表的最后一个节点。
L->next->next=NULL;
L->next=p;
}

结果:

转自:http://blog.csdn.net/niuer09/article/details/5961004

 

posted on 2013-05-16 22:04  wyy_yr  阅读(206)  评论(0编辑  收藏  举报

导航