首页 > 编程语言 >力扣92(java&python)-反转链表Ⅱ(中等)

力扣92(java&python)-反转链表Ⅱ(中等)

时间:2022-09-19 16:11:53浏览次数:62  
标签:pre 结点 java cur temp python next 链表 ListNode

题目:

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

示例1:

输入:head = [1,2,3,4,5], left = 2, right = 4

输出:[1,4,3,2,5]

示例2:

输入:head = [5], left = 1, right = 1

输出:[5]

提示:

链表中节点数目为 n
1 <= n <= 500
-500 <= Node.val <= 500
1 <= left <= right <= n
 

进阶: 你可以使用一趟扫描完成反转吗?

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/reverse-linked-list-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

一、头插法

1.首先定义一个虚拟头结点指向原始头结点,可以减少对头结点的特殊处理,将头结点当做普通结点处理;

2.定义两个指针一个为pre,一个为cur;

3.确定pre和cur指针的位置,需要根据题中给定的left值进行确定,将pre移动到第一个需要反转的结点的前面,将cur移动到需要反转的第一个结点上;

4.将cur后面一个结点temp保存,将当前cur指向cur的下下个结点,即cur.next=cur.next.next , 然后将保存的结点插入到pre后面;

5.重复步骤4;

6.最后返回dummyHead.next。

解释:

temp.next = pre.next这里为什么不能写成temp.next = cur?

看上面的图解就可以看出,cur所指向的结点没有变过,但是所在的位置是一直在变化的,pre和cur中间会一直插入结点,而每次插入都是在pre的后面。如果写成temp.next = cur就会删除上面已经反转的结点,比如4和3。

java代码:

 1 /**
 2  * Definition for singly-linked list.
 3  * public class ListNode {
 4  *     int val;
 5  *     ListNode next;
 6  *     ListNode() {}
 7  *     ListNode(int val) { this.val = val; }
 8  *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 9  * }
10  */
11 class Solution {
12     public ListNode reverseBetween(ListNode head, int left, int right) {
13         ListNode dummyHead = new ListNode(0,head);
14         //定义两个指针pre和cur
15         ListNode pre = dummyHead;
16         ListNode cur = dummyHead.next;
17 
18         //先确定两个指针的初始位置,pre应该在left-1,cur=left
19         for(int i = 1; i < left; i++){
20             pre = pre.next;
21             cur = cur.next;
22         }
23         //插入
24         for(int j = 1; j < right - left + 1; j++){
25             //保存cur的下一个结点
26             ListNode temp = cur.next;
27             //使cur指向它的下下个结点
28             cur.next = cur.next.next;
29             //将保存的结点插入
30             temp.next = pre.next;
31             pre.next = temp;
32         }
33         return dummyHead.next;
34 
35     }
36 }

 python3代码:

 1 # Definition for singly-linked list.
 2 # class ListNode:
 3 #     def __init__(self, val=0, next=None):
 4 #         self.val = val
 5 #         self.next = next
 6 class Solution:
 7     def reverseBetween(self, head: Optional[ListNode], left: int, right: int) -> Optional[ListNode]:
 8         dummyHead = ListNode(0,head)
 9         pre,cur = dummyHead,dummyHead.next
10 
11         # 确定pre和cur的位置
12         for i in range(1,left):
13             cur = cur.next
14             pre = pre.next
15         
16         # 插入操作
17         for i in range(1,right-left+1):
18             temp = cur.next
19             # 如果temp是尾结点cur.next为none
20             cur.next = temp.next if temp else None
21 
22             temp.next = pre.next
23             pre.next = temp
24         
25         return dummyHead.next

 二、递归

reverseBetween():含义就是将拿到的链表进行反转,然后返回反转后的链表的头结点(不细想过程,很容易绕进去) 还没完全弄明白,待更~

标签:pre,结点,java,cur,temp,python,next,链表,ListNode
From: https://www.cnblogs.com/liu-myu/p/16707419.html

相关文章

  • VBA中使用JAVASCRIPT
    PrivateSubCommandButton1_Click()DimjsstrDimsbAsStringDimoSCAsObjectDimiAsIntegerSetoSC=CreateObjectx86("MSScriptControl.ScriptControl")'......
  • Javaweb学习笔记第九弹
    MyBatis案例--环境准备1、依据之前在Navicat建立数据表的方法,新建立一个数据表2、将数据表的相关内容表现在Java文件的实例上:即成员变量和set、get成员方法3、new一个测......
  • python主文件调用其他文件函数的方法
    关键:from文件名import函数名主文件(main.py)需要和包含子函数的文件(fun_cal_modulus8.py)放到同一路径下fun_cal_modulus8.pyfromnumpyimport*#8水平defc......
  • Java的 static关键字
    通常,在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法   声明为static的方法有以下几条限制: · 它们仅能调用其他的static 方法。 · 它们只......
  • Javascript_DOM操作
    Javascript_DOM操作一、关于Javascript与DOM1.JavaScriptJavaScript简称JS,是一种解释型脚本语言。JavaScript是一种轻量级编程语言。JavaScript是可插入HTML页面的编......
  • Java学习单例式设计
    单例设计模式:1.所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例2.如何实现?饿汉式vs懒汉式3.区分饿汉式和懒汉......
  • Java复制Word文档
    MicrosoftWord提供了许多易于使用的文档操作工具,同时也提供了丰富的功能集供创建复杂的文档使用。在使用的时候,你可能需要复制一个文档里面的内容到另一个文档。本文介绍......
  • Java使用FTP下载文件(将流返回给HttpServletResponse)
    1.添加依赖<dependency><groupId>commons-net</groupId><artifactId>commons-net</artifactId><version>3.6</version>......
  • Python: 取消numpy科学计数法
    Numpy中默认是使用科学计数法来显示数据的,但是这种做法往往不利于我们观测数据,比如坐标数据等。那么如何取消numpy科学计数法呢,请往下看。np.set_printoptions()import......
  • 女生IT学Java好还是学前端好?
    这个要根据以下几点来分析来判断: 1、公司现状:公司女程序数量凤毛麟角,学Java的就更少了。女生选择前端,以后大概率碰到女前端程序猿,以后有个伴; 2、工资待遇:普遍认为Jav......