单链表的反转

该文章介绍了一个C语言实现的程序,通过双指针技巧来反转链表。程序首先定义了链表节点结构,然后在`convert`函数中,利用三个指针`per`,`pcurrent`,`prear`逐步反转链表。`Init`函数用于初始化链表,用户输入节点值,当输入-1时结束。最后,`foreach`函数遍历链表打印节点日期。
摘要由CSDN通过智能技术生成

这里的思路是双指针

 让pcurrent的指向由前向后变为由后向前,这样就可以指出来

#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<stdbool.h>
#include<stdlib.h>
typedef struct Node {
	int date;
	struct Node* next;
}Node;
void foreach(Node* head);
void convert(Node* head)
{
	Node* per = NULL;
	Node* pcurrent = head->next;//这里值得注意,如果一开始指向头节点的话,最后会造成死循环,因为反转过后pcurren->next并不是NULL,造成死循环
	Node* prear;
	while (pcurrent)
	{
		prear = pcurrent->next;//这里注意的顺序,1.prear=curren->next,因为后面的指针并没赋初值 
		pcurrent->next = per;//然后让当前指针下一个指向为之前的指针
		per = pcurrent;
		pcurrent = prear;
	}
	head->next = per;//这里也得注意,不加这步只是将链表转置了一下
	foreach(head);
}
void foreach(Node* head)
{
	Node* p = head;
	while (p)
	{
		p = p->next;
		printf("%d\n", p->date);
	}
}

void Init(Node* head) {
	int val = 0;
	Node* p = head;
	while (true)
	{
		printf("请输入各个节点的值:\n");
		scanf("%d", &val);
		if (val == -1)
			break;
		Node* newNode = (Node*)malloc(sizeof(Node));
		newNode->next = NULL;
		newNode->date = val;
		p->next = newNode;
		p = newNode;
	}
	convert(head);
}

int main() {
	Node* head = (Node*)malloc(sizeof(Node));
	head->next = NULL;
	head->date = -3;
	Init(head);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值