实现链表逆序输出

该博客介绍了如何使用C语言实现链表的就地逆序操作,通过取链表的前三个节点进行处理,包括头节点、第二个节点和用结构体指针p表示的第三个节点。提供参考代码链接。
摘要由CSDN通过智能技术生成

程序功能:

实现链表的就地逆序

程序主要思路:

取链表中前三个结点,其中表头结点为空,不存放数据,用结构体指针 head 表示; 第二个结点
用 head->next 进行表示,第三个结点用结构体指针 p 表示。

操作:											效果:
head->next->next = NULL;          		 令第二个结点的 next 指向 NULL,使第二和第三个结点断开
	
temp = p->next;							

p->next = head->next;					// B的next指向A

head->next = p;						    // head的next指向P

p = temp;								// p后移

代码段:

//===============================================================
//Summary:
//          C语言 类 
//FileName:
//          C语言.c
//Remarks:
//          实现就地逆置
//Date:
//          2019/8/9 14:45
//Author:
//          张珂(1575595743@qq.com)
//Version:
//			1.0
//===============================================================
#include<stdio.h>
#include<stdlib.h>
typedef char ElemType;
typedef struct node
{
	ElemType data;		//定义字符串类型的data变量
	struct node *next;	//定义结构数组中的指针
}NODE;
//--------------------向链表中填入数据--------------------
void CreatFromTail(NODE* l)
{
	NODE *r, *s;
	char c;				//用来存放输入的字符 
	int flag = 1;		//设置一个标志,初始值为1;当输入"$"符号时,flag为0;建表结束
	r = l;				//r指针动态指向链表的当前表尾,以便做尾插入,其初值指向头结点
	while (flag)		//循环输入表中的元素值,将建立的新节点s插入表尾
	{
		c = getchar();	//获取输入字符
		if (c != '$')	//判断是否到达输入元素的终点; 没有到达,使用尾插法
		{
			s = (NODE *)malloc(sizeof(NODE));		//初始化新结点
			s->data = c;			//为结点赋值
			r->next = s;			//将新建s结点插在r结点(头结点)之后
			r = s;					//r结点后移,r始终指向表尾
		}
		else			//元素已经全部插入
		{
			flag = 0;		//确定跳出循环的条件
			r->next = NULL;		//将最后一个结点的next链域置空,表示链表的结束
		}
	}
}
//--------------------链表取反--------------------		方法一
//void Reverse(NODE* head)
//{
//	NODE *pf = NULL, *temp = NULL, *pb = NULL;
//	pf = head;
//	if(head == NULL || head->next == NULL)		//当链表是空表,或是只有一个元素时,不需要进行逆序操作		
//		return ;
//	pb = pf->next;
//	head->next = NULL;			//将head结点从链表中分离出来
//	/*
//		head->	temp		->		head  <-temp	
//		pf		pb							pf		pb
//		
//		head特别指代头结点; temp是临时结点,每一次循环都会重新定义
//	*/
//
//	while (pb != NULL)			//当pb存在时
//	{
//		temp = pb;				//保留原来的结点pb							
//		pb = pb->next;			//pb指向下一结点
//		temp->next = pf;
//		pf = temp;				//pf指向下一结点
//	}
//}


//--------------------链表逆序--------------------
void Reverse(NODE * head)
{
	NODE *p, *temp;
	if (head->next == NULL || head->next->next == NULL)	
		return;
	/*			A			B				C			D	
		-		-			-			   -			-   
		head	head->next	p				temp
	*/
	p = head->next->next;
	head->next->next = NULL;		//断开A与B, p从B点往后移
	while (p != NULL)
	{
		temp = p->next;
		p->next = head->next;		//B的next指向A
		head->next = p;				//head的next指向P
		p = temp;					//p后移
	}
}
//--------------------输出链表--------------------
void printLink(NODE* head)
{
	NODE *p = head->next;
	while (p != NULL)
	{
		printf("%c  ", p->data);
		p = p->next;
	}
}
int main()
{
	NODE* h;
	h = (NODE*)malloc(sizeof(NODE));
	h->next = NULL;
	printf("please enter some chars:\n");		//输入数据
	CreatFromTail(h);

	printf("The Link you created is :\n");		//打印输入的数据
	printLink(h);
	
	Reverse(h);		
	printf("\nAfter reverse, the link is :\n");	//打印逆置后的数据
	printLink(h);
	return 1;
}

参考文章:
https://blog.csdn.net/autumn20080101/article/details/7607148

https://blog.csdn.net/peng_apple/article/details/79614846

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值