给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表。

发布时间:2024-12-02 12:29

掌握基本的数据结构,如数组和链表。 #生活技巧# #数码产品使用技巧# #编程入门指南#

最新推荐文章于 2023-07-29 19:54:59 发布

小型骷髅 于 2022-01-09 20:28:55 发布

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

力扣原题:

 先贴代码:

public class Solution92 {

public ListNode reverseBetween(ListNode head, int left, int right) {

ListNode newhead = new ListNode(-1);

newhead.next = head;

ListNode cur = newhead;

for (int i = 0; i < left-1; i++) {

cur = cur.next;

}

ListNode ret = cur.next;

for (int i = 0; i < right-left; i++) {

ListNode retNext = ret.next;

ListNode curNext = cur.next;

cur.next = retNext;

ret.next = retNext.next;

retNext.next = curNext;

}

return newhead.next;

}

}

思路分析

题目中告诉我们,要求将链表中位置left到位置right之间的链表进行反转操作;例如left设为2,right设为4,那么意思如下图演示:

首先我们遇到这题解题时首先想到的反转方法应该是将位置为left节点(后简称为left节点)的前驱节点指向位置为right节点(后简称为right节点),再将left节点指向right节点的后继节点,然后再分别将这条链表内各节点的指向更改为前一个节点。但是这个方法未免过于复杂冗余,需要找到left节点和right节点,并且再进行遍历将链表中每个节点的指向更改。

我们在平时生活中肯定遇到过插队现象:每一个人都想往前面插,这样来一个人插一次队来一个人插一次队,慢慢的最前面的人就被挤到后面去了,这一题的解法也是类似的;

将在left位置后面的每一个节点都插入队伍的最前面,直至left节点成为最后一个节点(这里最后一个节点指的是这一条需要反转的链表的最后一个节点,并非一整条链表的最后一个;队伍的最前面也同理,是指需要反转的链表的最前面),这样我们只需要一次遍历链表就完成了反转链表的操作。具体操作如下图:

这里为了处理头节点也需要反转的情况,引入了一个虚拟头节点,方便解题:

 然后创建cur节点使其指向left节点的前驱节点:

 之后开始遍历链表:

 最后返回新建的虚拟头节点的next节点:

网址:给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表。 https://www.yuejiaxmz.com/news/view/346841

上一篇:云镜—六方云
下一篇:Android实践

相关内容

html网页制作——HTML节日主题网页项目的设计与实现——圣诞节日介绍(HTML+CSS)
第一个响应式网站之环保网站(源码+图片下载)
一种面向矢量瓦片高效构建的空间索引方法
效率工具:数据分析中常见的Excel函数都在这里了
算法优化的艺术:降低时间复杂度与提升算法效率的实战技巧
9个超实用的家居收纳用品 帮你省时省精力
2016年普通家庭五大理财妙招 你知道几个?
JavaWeb=CSS样式表
区间计数
几个简单有趣的算法

随便看看