单向链表反转问题

下面内容来自:  https://blog.csdn.net/blioo/article/details/62050967

假设当前创建好的链表如下:

首先让头结点与第一个元素节点断开,但是要注意在断开之前需要用p指针指向第一个元素节点来保存第一个元素节点位置,然后在断开。在这里有一个指针q指向一个指针域为空的节点,这个节点用来作为链表反转后的最后一个节点。

让第二个元素节点的指针从指向第三个元素节点变为指向第一个元素节点,以此类推,直至指针p指向原链表最后一个元素。

 

p指针指向NULL时,让原头节点的指针域指向原来最后一个元素节点。此时链表倒置已完成。

【根据博客内容,我编写相关的代码: 实现完整的逆置过程】

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef struct Link
{
	char elem;
	struct Link* next;
}link;

link* initLink()
{
	link* p = (link*)malloc(sizeof(link));
	link* temp = p;
	//生成链表
	for (int i = 1; i < 5; i++)
	{
		link* a = (link*)malloc(sizeof(link));
		a->elem = i;
		a->next = NULL;
		temp->next = a;
		temp = temp->next;
	}
	return p;
}
void display(link* p)
{

	link* temp = p;//将temp指针重新指向头结点   

	//只要temp指针指向的结点的next不是Null,就执行输出语句。   

	while (temp->next)
	{

		temp = temp->next;

		printf("%d  ", temp->elem);

	}

	printf("\n");

}

link reverse(link *ph) {
	link *p, *q, *pr;
	p = ph->next;
	q = NULL;
	ph->next = NULL;
	while (p) {
		pr = p->next;
		p->next = q;
		q = p;
		p = pr;
	}
	ph->next = q;
	return *ph;
}

/* 主函数 */
int main(int argc, char** argv)
{
	link *p = initLink();
	display(p);
	reverse(p); //   链表倒置。。
	display(p);
	system("pause");
}

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值