逆转链表的三种方法

方法一:头插法(两个指针)

代码:

复制代码
//逆转带头链表,头插法
LinkList Reverse(LinkList &L){
	LNode *p,*q;//p为工作指针,q为p的后继 
	p=L->next;
	L->next=NULL;
	while(p!=NULL) {//依次摘下节点 
		q=p->next;//暂时存p的后继 
		p->next=L->next;//将p节点插入到头节点之后 
		L->next=p;
		p=q;
	}
	return L;
} 

时间复杂度O(n);空间复杂度O(1)

方法二:三个指针(类似尾插法)

代码:

复制代码
//逆转带头单链表,三指针,类似尾插法 
LinkList Reverse(LinkList &L){
	LNode *p,*q=L->next,*r=q->next;
	 q->next=NULL;//处理第一个节点 
	 while(r!=NULL){//r不为空,说明q面还有节点 
	 	p=q;
	 	q=r;
	 	r=r->next;
	 	q->next=p;//反转指针 
	 }
	 L->next=q;//处理最后一个节点 
	 return L;
}

时间复杂度O(n);空间复杂度O(1)

方法三:利用栈的先进后出

代码:

复制代码
struct ListNode* reverseList(struct ListNode* head){
	if(head==NULL){
		return NULL;
	}
	struct ListNode* p=head;
	int size=0;
	while(p != NULL){//计算链表长度 
		size++;
		p=p->next;
	}
	struct ListNode* stack[size];
	int top=-1;
	p=head;
	while(p != NULL){//进栈 
		stack[++top]=p;
		p=p->next;
	} 
	struct ListNode* head1=stack[top];
	p=head1;
	while(top != -1){//出栈 
		p->next=stack[top--];
		p=p->next;
	}
	p->next=NULL;
	return head1; 
 
}

时间复杂度:O(n);空间复杂度O(n)

相关推荐
白狐_7984 小时前
408数据结构第5章:二叉树遍历序列题——技巧、判断与真题型总结
数据结构
Forever Nore6 小时前
学完C语言力扣第一题做不来正常吗
数据结构·算法
旖旎夜光9 小时前
LeetCode 11:盛最多水的容器(双指针问题) —— 题解
数据结构·c++·算法·leetcode·双指针
不一样的故事12611 小时前
芯片设计是一个高度复杂、分工精细的系统工程
数据结构·经验分享
梁辰兴12 小时前
软件工程:面向数据结构的设计方法
数据结构·软件工程·梁辰兴·面向数据结构的设计方法·jackson方法·warnier方法·方法比较
白狐_79813 小时前
408数据结构第7章:查找②——顺序、折半、分块查找秒杀 + 真题
数据结构·算法
hold?fish:palm13 小时前
链表的基本原理和实现(C++版本)
数据结构·c++·链表
码完就睡14 小时前
数据结构——树、二叉树基础概念
数据结构·算法
疯狂打码的少年16 小时前
【数据结构】栈:定义、顺序栈与链式栈
数据结构·笔记
wabs66616 小时前
关于图论【最短路径之Bellman_ford 算法|卡码网94.城市间货物运输的思考】
数据结构·算法·图论·卡码网·bellman_ford·求最短路径