单链表倒置,想要倒置应先整理一下倒置的思路,应先知道链表分为几种:
1.单链表:单链表的任意的一个结点只有一个数据域 ,一个指针域(数据域存储数据,指针域存储下一个结点的头指针),结构如下:
typedef struct node
{
int data;
struct node *link;
}LinkList;
2.双向链表:在双向链表中它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱,数据域存储数据。结构如下:
typedef struct doubleNode
{
int data;
struct doubleNode* prev;
struct doubleNode* next;
}DoubleNode;
3循环链表:最后一个结点的指针域指向头结点,整个链表形成一个环
链表倒置思路如下:
第一,先创建一个链表;创建链表需要先创建结点,结点的创建如下:
typedef struct node
{
int data;
struct node *link;
}LinkList;
链表创建如下:
Node *CreatList(void)
{
int firtData, i, n;
Node *phead, *p =NULL, *q =NULL;
phead =NULL;
printf("请输入您要建立的链表长度:\n");
scanf("%d", &n);
printf("请输入您要输入的数据:\n");
//将新节点的指针成员赋值为空。若是空表,将新节点连接到表头;若是非空表,将新
//节点接到表尾,其中phead中保存的是第一次创建空链表的地址。
for(i=0; i<n; ++i)
{
scanf("%d", &firtData);
p = (Node *)malloc(sizeof(Node));
p->data =firtData;
if(NULL == phead)
q = phead = p;/*空表,接入表头*/
else
q->next = p;/*非空表,接到表尾*/
q = p;//这个起着指向下一个结点的作用
}
p->next =NULL;//最后将最后一个结点的指针域清空了
return phead;//返回这个链表的首地址
}
第二,链表的倒置
Node *ReverseList(Node *phead)
{
Node *p, *q, *r;
p = phead;
q=r=NULL;
while(p)
{
q = p->next;//获取链表的第二个结点
p->next = r;//将头链表的下一个结点置为NULL
r = p;//将头结点的地址赋给r
p = q;//将第二个结点的地址赋值给p
}
return r;
}
第三,输出倒置后的链表void ShowList(Node *phead)
{
Node *p;
p = phead;
while(p)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main(void)
{
Node *phead;
phead =CreatList();
printf("链表逆置前的数据:\n");
ShowList(phead);
phead =ReverseList(phead);
printf("链表逆置后的数据:\n");
ShowList(phead);
return 0;
}