反转链表 II(leetcode)

题目链接:. - 力扣(LeetCode)

分享两道解题思路:

第一个:

将left~right之间的节点翻转,首先left前的节点的next置为空,right的指针置为空,

然后拼接

p1指的是left前面的一个 p1->next = NULL

p2指的是left

p3指的是right p3->next = NULL;

p4指的是right后的一个

注意:当p1为空时,即left为1,返回值就不是头结点,而是翻转后的第一个节点

复制代码
 struct ListNode* reserve( struct ListNode* phead )
 {
    if( !phead || !phead->next )return phead;
    struct ListNode* p1 = NULL;
    struct ListNode* p2 = phead;
    struct ListNode* p3 = phead->next;
    while( p2 )
    {
        p2->next = p1;
        p1 = p2;
        p2 = p3;
        if( p3 )p3 = p3->next;
    }
    return p1;
}
struct ListNode* reverseBetween(struct ListNode* head, int left, int right) {
    if( left == right )
    return head;
    int i = 0;
    struct ListNode* phead = head;
	struct ListNode* p1 = NULL;
	struct ListNode* p2 = NULL;
	struct ListNode* p3 = NULL;
	struct ListNode* p4 = NULL;
	for( i = 1 ; head ; i++)
	{
		if( i == left - 1 )
		{
			p1 = head;
			struct ListNode* temp ;
			temp = head->next;
			head = temp;
		}
		else if( i == left )
		{
			p2 = head;
			head = head->next;
		}
		else if( i == right  )
		{
			p3 = head;
			p4 = head->next;
			struct ListNode* temp ;
			temp = head->next;
			head->next = NULL;
			head = temp;
		}
		else
		{
			head = head->next;
		}
	}
	struct ListNode* temp  = reserve(p2);
	if( p1 )
	p1->next = temp;
	p2->next = p4;
	if( !p1 )return temp;
	return phead;
}

思路二:

栈处理:将left~right之间的节点存入栈中,然后再将栈顶数据倒出

要有哨兵节点:原因:当left为1时,头结点改变(会影响返回值),为了不让头结点改变,增加头结点

复制代码
typedef struct Stack
{
	struct ListNode** arr;
	int size;
	int top;
}ST;
void StackInit(ST* obj)
{
	obj->size = 0;
	obj->top = -1;
	obj->arr = (struct ListNode**)malloc(sizeof(struct ListNode*)*10000);
}
void StackPush( ST* obj,struct ListNode* temp )
{
	obj->arr[++obj->top] = temp;
	obj->size++;
}
void StackPop( ST* obj )
{
	obj->size--;
	obj->top--;
}
bool StackIsEmpty(ST* obj )
{
	return obj->size==0;
}
struct ListNode* StackTop( ST* obj )
{
	return obj->arr[obj->top];
}
struct ListNode* reverseBetween(struct ListNode* head, int left, int right) {
    ST obj;
	StackInit(&obj);
	struct ListNode* phead = (struct ListNode*)malloc(sizeof(struct ListNode));
	struct ListNode* temp = phead;
	phead->next = head;
	struct ListNode* p = head;
	int i = 1;
	while( p )
	{
		if( i == left )
		{
			while( i <= right  )
			{
				i++;
				StackPush(&obj,p);
				p = p->next;
			}
			while( !StackIsEmpty(&obj) )
			{
				phead->next = StackTop(&obj);
				phead = phead->next;
				StackPop(&obj);
			}
			phead->next = p;
		}
		else
		{
			i++;
			phead->next = p;
			phead = phead->next;
			p = p->next;
		}
	}
	return temp->next;
}
相关推荐
浅念-4 小时前
刷穿LeetCode:BFS 解决 Flood Fill 算法
数据结构·c++·算法·leetcode·职场和发展·bfs·宽度优先
im_AMBER6 小时前
手撕hot100之矩阵!看完这篇就AC~
javascript·数据结构·线性代数·算法·leetcode·矩阵
如君愿7 小时前
考研复习 Day 30 | 习题--计算机网络 第五章(运输层 上)、数据结构 图(上)
数据结构·计算机网络·课后习题
weixin_421725267 小时前
C语言中volatile关键字怎么用C语言volatile在多线程中的作用
c语言·数据结构·运算符优先级·变量命名·volatile关键字
沪漂阿龙8 小时前
程序员面试技术爆款文:2026大厂算法通关手册——从零基础到LeetCode刷穿,这一篇就够了
算法·leetcode·面试
05候补工程师8 小时前
【408 从零到一】线性表逻辑特征、存储结构对比与 C/C++ 动态内存分配避坑指南
c语言·开发语言·数据结构·c++·考研
努力努力再努力wz9 小时前
【MySQL 进阶系列】拒绝滥用root:从 mysql.user 到权限校验,带你彻底理解用户管理与授权机制!
android·c语言·开发语言·数据结构·数据库·c++·mysql
炸膛坦客10 小时前
嵌入式 - 数据结构与算法:(1-4)数据结构 - 单链表的两个核心缺点(引入循环/双向链表)
c语言·数据结构·链表
Lenyiin10 小时前
《LeetCode 顺序刷题》61 - 70
java·c++·python·算法·leetcode·lenyiin
Hesionberger10 小时前
LeetCode 78:子集生成全攻略
java·开发语言·数据结构·python·算法·leetcode·职场和发展