1、链表结构:
2、分析:
- 若链表为空或者只有一个节点,则直接返回
- 设置两个前后相邻的指针p,q。将p所指向的节点作为q指向节点的后继
- 重复2直到q为空
- 调整立案表头和链表尾
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