设计一个算法,将链表中所有结点的链接方向“原地”逆转,即要求仅利用原表的存储空间,换句话说,要求算法的空间复杂度为O(1)

设计一个算法,将链表中所有结点的链接方向“原地”逆转,即要求仅利用原表的存储空间,换句话说,要求算法的空间复杂度为O(1)

代码思路:
这里要求不用额外空间,那么就要考虑链表自身的性质了。我们可以先让指针p指向链表L首元素,然后把链表L整个断开(也就是说此时L是空链),然后依次把p指向的元素向L中头插即可。
(头插会形成逆序)

//将链表元素原地逆转(带头结点)
void NiZhuan(LinkList* L) {
	LNode* p = (*L)->next;//用p继承一下L的元素
	(*L)->next = NULL;//L元素清空

	//下面把p的元素进行头插,即可完成逆序
	while (p != NULL) {
		LNode* s = (LNode*)malloc(sizeof(LNode));
		s->next = (*L)->next;
		s->data = p->data;
		(*L)->next = s;
		p = p->next;
	}
	
}
int main()
{
	LinkList L;
	InitList2(&L);//初始化一个带头结点链表1,2,3,4,5,6,7,8,9,10
	printf("初始链表为:");
	print2(L);

	printf("\n");

	NiZhuan(&L);
	printf("逆转后的链表为:");
	print2(L);

	return 0;
}

设计一个算法,将链表中所有结点的链接方向“原地”逆转,即要求仅利用原表的存储空间,换句话说,要求算法的空间复杂度为O(1)_第1张图片
ps:链表初始化及打印函数

#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
//单链表定义
//链表结点
int A[10] = { 1,2,3,4,5,6,7,8,9,10 };
int B[6] = { 4,7,8,9,11,13 };//4,7,8,9,11,13
typedef struct {//定义单链表结点类型
	int data;//数据域
	struct LNode *next;//指针域
}LNode, *LinkList;


//带头结点初始化-尾插法
void InitList2(LinkList* L) {
	(*L) = (LNode*)malloc(sizeof(LNode));
	(*L)->next = NULL;
	LNode* rear = (*L);//标记表尾
	int i = 0;
	for (i = 0;i < 10;i++) {
		LNode* p = (LNode*)malloc(sizeof(LNode));//创建一个新结点
		p->data = A[i];//新结点赋值
		rear->next = p;//接到L上
		rear = p;//标记表尾
	}
	rear->next = NULL;
}


void print2(LinkList L) {//打印带头结点的链表
	LNode* i = L->next;//用i指针遍历整个链表
	while (i != NULL) {
		printf("%d ", i->data);
		i = i->next;
	}
}

你可能感兴趣的:(数据结构代码汇总,算法,链表,数据结构,原地逆置,逆置)