题目

反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。

说明:

1 ≤ m ≤ n ≤ 链表长度。

示例:

输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL

解答

一轮指针变换,时间复杂度O(n),空间复杂度O(1)

首先,在链表头部新建两个空节点thead、p2,令p、p3指向thead,c指向head,所有指针往后移动m个位置,p3始终和p相差n-m个位置(记录反转链表的第一个节点),开始向后反转n-m个节点。

反转完成后,p处于反转链表的最后一个位置,p3反转链表的第一个位置,p2处于反转链表的前一个节点,c处于反转链表的额后一个节点。因此,令p2指向p,p3指向c即可,另外需要注意,若链表从头开始反转,则return p指针即可。

# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None class Solution:
def reverseBetween(self, head: ListNode, m: int, n: int) -> ListNode:
if not head.next or m==n:
return head
n2, m2 = n, m thead = ListNode(-1)
thead.next = head
p, p3 = thead, thead p2 = ListNode(-1)
p2.next = thead
c = head # 指针就位
while m:
p2 = p2.next
p = p.next
p3 = p3.next
c = c.next m -= 1 # 反转
Q = n2-m2
while Q:
n = c.next
c.next = p
p = c
c = n Q -= 1
p2.next = p
p3.next = c # 从头反转
if m2==1 and n2!=m2:
return p
return thead.next

最新文章

  1. Oracle数据逻辑迁移综合实战篇
  2. 【iCore3 双核心板_FPGA】例程十三:FSMC总线通信实验——复用地址模式
  3. 旋转camera到特定对象
  4. Yii框架下使用redis做缓存,读写分离
  5. Css样式之overflow
  6. [Python学习笔记][第八章Python异常处理结构与程序调试]
  7. terminal color
  8. git使用时遭遇the authenticity of host can't be established
  9. 【JS】第一个js示例
  10. 洛谷 [P2296] 寻找道路
  11. 微信小程序(四) 模板的使用
  12. ThreadPoolExecutor源码详解
  13. 专题1:记忆化搜索/DAG问题/基础动态规划
  14. unsafe关键字
  15. 带上RESTful的金手铐,你累吗?
  16. 『Python』skimage图像处理_旋转图像
  17. java_main
  18. OpenStack概念架构简述
  19. 2018.08.30 Tyvj1952 Easy(期望dp)
  20. c++ imooc自学计划

热门文章

  1. 转载:JVM内存分代策略
  2. css3之属性选择器
  3. spring-jdbc-aop事务
  4. webServices学习四(---WebService监听工具)
  5. Lamdba表达式的代码使用讲解
  6. Leetcode131. Palindrome Partitioning分割回文串
  7. ubuntn系统下将文件拷贝到优盘中及挂载概念理解
  8. Eular质数筛法
  9. ArrayList,LinkedList,Vestor
  10. Django REST Framework之认证组件