【leetcode刷题】T105-反转链表 II
时间:2022-06-26
本文章向大家介绍【leetcode刷题】T105-反转链表 II,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
【题目】反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。说明:
1 ≤ m ≤ n ≤ 链表长度。示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL
【思路】本题相较于【T104-翻转链表】,增加两项内容:一是需要找到要翻转的节点,二是需要保存链表左侧最后一个非翻转节点,用于修改指针。【代码】python版本# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def reverseBetween(self, head, m, n):
"""
:type head: ListNode
:type m: int
:type n: int
:rtype: ListNode
"""
if not head or not head.next or m == n:
return head
# 添加一个节点
add = ListNode(0)
add.next = head
head = add
count = 1
p = head
while p:
if count == m:
break
p = p.next
count += 1
# 记录最后一个未旋转的节点
add = p
p = p.next
q = p.next
r = q.next
while q:
if count == n:
break
r = q.next
q.next = p
p = q
q = r
count += 1
# 修改头尾指针
add.next.next = r
add.next = p
return head.next
C++版本/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int m, int n) {
if(!head || !head->next || m == n)
return head;
// 添加一个节点
ListNode* add = new ListNode(0);
add->next = head;
head = add;
// 找到节点
ListNode* p = head;
ListNode* q;
ListNode* r;
int count = 1;
while(p){
if(count == m)
break;
else{
count++;
p = p->next;
}
}
// 记录最后一个未翻转的元素
add = p;
p = p->next;
if(p->next)
q = p->next;
else
return head->next;
// 翻转
while(true){
if(count == n)
break;
r = q->next;
q->next = p;
p = q;
q = r;
count++;
}
// 修改指针
add->next->next = r;
add->next = p;
return head->next;
}
};
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 独家 | 在Python编程面试前需要学会的10个算法(附代码)
- 为什么一个还没毕业的大学生能够把 IO 讲的这么好?
- 如何将单 master 升级为多 master 集群
- 为 Kubernetes 节点发布扩展资源
- Kubernetes 资源预留配置
- PHP一些常见的漏洞梳理
- File的基本操作
- 一文教你在Colab上使用TPU训练模型
- 如何在Docker容器中运行Docker [3种方法]
- [漏洞复现] 三.CVE-2020-0601微软证书漏洞及Windows验证机制欺骗复现
- PDF文件密码破解
- Ubuntu 制作离线源
- keycloak+istio实现基于jwt的服务认证授权
- dplyr 包arrange对数据排序
- ELK 日志报警插件 ElastAlert