C语言实现——反转链表

本文介绍了如何在不申请额外内存空间的情况下,使用双指针法、递归法和头插法三种方法来反转单链表,并提供了C++代码示例。
摘要由CSDN通过智能技术生成
     力扣题号:206. 反转链表

一、题目描述

反转一个单链表,要求不能申请额外的内存空间。

二、示例

输入:1→2→3→4→5→6→NULL

输出:6→5→4→3→2→1→NULL

三、求解思路

实现对单链表的反转,有三种方法,分别为:双指针法,递归法,头插法。其中,头插法是对当前链表中的所有元素再进行一次头插法,实现链表的反转。

四、代码实现

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>

typedef struct Lnode {
	int data;
	struct Lnode* next;
}Lnode, * Linklist;


/*
头插法插入链表
参数说明
L -- 传入链表
x -- 结点上的数据
*/
bool headInsert(Linklist& L, int x) {

	Lnode* newnode = (Lnode*)malloc(sizeof(Lnode));
	if (newnode == NULL) {
		return false;
	}
	newnode->data = x;
	newnode->next = L;
	L = newnode;

	return true;
}

/*
双指针法反转链表
参数说明
L -- 传入链表
*/
void doublePointerReverse(Linklist &L) {
	Lnode* cur = L;
	Lnode* pre = NULL;
	
	while (cur) {
		Lnode* tmp = cur->next;
		cur->next = pre;
		pre = cur;
		cur = tmp;
	}
	L = pre;
}

/*
递归法反转链表
参数说明
L -- 传入链表
*/
Lnode* reverse(Lnode* cur, Lnode* pre) {
	if (cur == NULL) {
		return pre;
	}
	Lnode* tmp = cur->next;
	cur->next = pre;
	return reverse(tmp,cur);
}
void recursionReverse(Linklist& L) {
	L = reverse(L,NULL);
}

/*
头插法法反转链表
参数说明
L -- 传入链表
*/
void headInsertionReverse(Linklist& L) {
	Lnode* head = NULL;
	while (L)
	{
		Lnode* tmp = L->next;
		
		// 将原链表中的结点插入新的链表中
		L->next = NULL;
		if (head != NULL) {
			L->next = head;
		}
		head = L;

		// 原链表向后移动
		L = tmp;
	}
	L = head;
}

/*
打印链表
参数说明
L -- 传入链表
*/
void print(Linklist L) {

	if (L == NULL) {
		return;
	}
	while (L) {
		printf("%3d", L->data);
		L = L->next;
	}
	printf("\n");
}


int main() {

	// 创建链表
	Linklist L = NULL;
	headInsert(L, 1);
	headInsert(L, 2);
	headInsert(L, 2);
	headInsert(L, 3);
	headInsert(L, 5);
	headInsert(L, 7);
	headInsert(L, 7);

	printf("Linklist:\n");
	print(L);

	// 双指针法
	printf("双指针法: \n");
	doublePointerReverse(L);
	print(L);

	// 递归法
	printf("递归法: \n");
	recursionReverse(L);
	print(L);

	// 头插法反转
	printf("头插法反转: \n");
	headInsertionReverse(L);
	print(L);

	return 0;
}

五、运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值