链表的学习—带头结点单向链表的逆置

一个单向的链表,实现它的逆置并不难,我在网上看到了其中的一种算法,叫做就地逆置,它的实现思路让我花了好久的时间才理解清楚。。。(可能是我太笨了吧,敲打)
下面的代码从头到尾,展现了带头结点链表的初始化、建立、展示、逆置的过程。使用语言为标准C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>

typedef int Status;	//函数状态类型

typedef int ElemType;	//元素类型

typedef struct node{
	ElemType data;
	struct node *next;
}Node,*LinkList;//结点类型

Status InitList(LinkList *L);
Status CreatList(LinkList L,int n);
Status DisplayList(LinkList L);
Status Reverse(LinkList L);

int main(void)
{
	LinkList L;
	int L_Length;
	InitList(&L);//初始化链表
	printf("请输入单链表的长度:\n");
	scanf("%d",&L_Length);
	if(L_Length<1)
		exit(-1);//长度不符合要求
	printf("请依次输入各个元素的值:\n");
	CreatList(L,L_Length);
	DisplayList(L);
	Reverse2(L);
	printf("After reverseing!\n");
	DisplayList(L);
	return 0;
}
//初始化一个链表
Status InitList(LinkList *L)
{
	*L = (LinkList)malloc(sizeof(node));
	if(!(*L))
		exit(-2);
	return 1;
}
//在初始化的基础上按顺序创建一个链表
Status CreatList(LinkList L,int n)
{
	LinkList p = L;
	int i;
	for(i=0;i<n;i++)
	{
		(p->next) = (LinkList)malloc(sizeof(node));
		if(!(p->next))
			exit(-2);
		scanf("%d",&p->next->data);
		p = p ->next;
	}
	p->next = NULL;
	return 1;
}
//依次输出单链表中的各个元素
Status DisplayList(LinkList L)
{
	LinkList p;
	p = L->next;
	while(p)
	{
		printf("%-5d",p->data);
		p = p->next;
	}
	printf("\n");
	return 1;
}

//逆置 (就地逆置)

Status Reverse(LinkList L)
{
	LinkList last = L->next;
	LinkList first;
	while(last->next)
	{
		first = L->next;
		L->next = last->next;
		last->next = L->next->next;
		L->next->next = first;
	}
	return 1;
}


我当时在分析这个逆置函数Reverse()时发生困难,按照我的思路,会写出这样的逆置函数:

Status Reverse(LinkList L)
{
	LinkList p = L->next;
	LinkList q = L->next->next;
	LinkList t = NULL;
	while(q != NULL)
	{
		t = q->next;
		q->next = p;
		p=q;
		q = t;
	}
	L->next->next = NULL;//设置链表尾
	L->next = p;			//修改链表头
	return 1;
}
我的思路可以按照下边的示意图来理解(花了半天画这个图,动手能力待加强啊!):


为了理解原先的逆置函数:

//逆置 (就地逆置)
Status Reverse(LinkList L)
{
	LinkList last = L->next;
	LinkList first;
	while(last->next)
	{
		first = L->next;
		L->next = last->next;
		last->next = L->next->next;
		L->next->next = first;
	}
	return 1;
}
我画出下边这个图,注意节点的连接关系每次循环first和last指向的节点都在变,终于完全的理解了,开心!我画了这两个图作为学习的笔记!链表的逆置必须画图才能更好的理解!


  • 19
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值