leetcode92 反转链表II

这篇具有很好参考价值的文章主要介绍了leetcode92 反转链表II。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目

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

示例

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

解析

这道题不太简单,分为两种方法,先说不好理解的那种方法,主要是官方题解中的第二种方法(一次遍历穿针引线头插法),注意这种反转和之前遇到过的都不一样,写的时候很容易出错(在画图的前提下,易错点都在下面代码里了)

代码如下:

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func reverseBetween(head *ListNode, left int, right int) *ListNode {
	dummy := &ListNode{}
	dummy.Next = head
	pre := dummy
	for i := 0; i < left-1; i++ { // 注意这个left和right的值,自己画图的时候就能发现需要-1才合适
		pre = pre.Next // 此时移到了left所在的前一位
	}
	cur := pre.Next
	for i := 0; i < right-left; i++ { // 这个范围想不明白的话也是画图用测试用例来看
		next := cur.Next
		cur.Next = next.Next
		next.Next = pre.Next // 一定要注意这一步,不是指向cur,因为cur后面会走
		pre.Next = next
	}
	return dummy.Next
}

第二种方法是在之前反转链表的基础上改进,稍微好理解一点,直接调用之前的反转链表的方法(当然这个方法也可以改成不需要返回值)文章来源地址https://www.toymoban.com/news/detail-731718.html

func reverseBase(head *ListNode) *ListNode {
	var pre *ListNode
	cur := head
	for cur != nil {
		next := cur.Next
		cur.Next = pre
		pre = cur
		cur = next
	}
	return pre
}

func reverseBetween(head *ListNode, left int, right int) *ListNode {
	if head == nil {
		return head
	}
	dummy := &ListNode{}
	dummy.Next = head
	pre := dummy
	for i := 0; i < left-1; i++ {
		pre = pre.Next // pre是left节点前面的一个节点
	}

	// 找到right节点
	rightNode := pre.Next
	for i := 0; i < right-left; i++ { // 画图画图,想不明白就画图
		rightNode = rightNode.Next
	}

	// 在此基础上切割出来一个子链表(先保留最后要链接的节点)
	leftNode := pre.Next
	rightAfter := rightNode.Next

	// 切断链表
	pre.Next = nil
	rightNode.Next = nil

	rightNode = reverseBase(leftNode) // 传入的其实是左结点,反转后返回的是右节点了

	// 接回去
	pre.Next = rightNode
	leftNode.Next = rightAfter

	return dummy.Next
}

到了这里,关于leetcode92 反转链表II的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++】每日一题 92 反转链表

    给你单链表的头指针 head 和两个整数 left 和 right ,其中 left = right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。 先创建一个虚拟头节点 dummy,然后找到需要反转位置的前一个节点 pre。接着进行反转操作,将节点逐个插入到 pre 节点之后,最后返回虚拟

    2024年03月11日
    浏览(30)
  • 力扣每日一道系列 --- LeetCode 206. 反转链表

    📷 江池俊: 个人主页 🔥个人专栏: ✅数据结构探索 ✅LeetCode每日一道 🌅 有航道的人,再渺小也不会迷途。 LeetCode 206. 反转链表 初始化两个指针, cur 和 newhead 。 cur 指向给定的链表头节点, newhead 初始为 NULL 。 在 cur 不为空的情况下,执行循环。 首先,记录下 cur 的下

    2024年02月04日
    浏览(31)
  • 数据结构:带环单链表基础OJ练习笔记(leetcode142. 环形链表 II)(leetcode三题大串烧)

    目录 一.前言  二.leetcode160. 相交链表  1.问题描述 2.问题分析与求解 三.leetcode141. 环形链表 1.问题描述 2.代码思路  3.证明分析  下一题会用到的重要小结论: 四.leetcode142. 环形链表 II 1.问题描述 2.问题分析与求解 Judgecycle接口: 方法一: 方法二:  单链表和带环单链表

    2023年04月08日
    浏览(30)
  • LeetCode //C - 92. Reverse Linked List II

    Given the head of a singly linked list and two integers left and right where left = right, reverse the nodes of the list from position left to position right , and return the reversed list.   Example 1: Input: head = [1,2,3,4,5], left = 2, right = 4 Output: [1,4,3,2,5] Example 2: Input: head = [5], left = 1, right = 1 Output: [5] Constraints: The number of

    2024年02月11日
    浏览(29)
  • 反转链表II

    江湖一笑浪滔滔,红尘尽忘了 示例 链表这部分的题,不少都离不开单链表的反转,参考:反转一个单链表 这道题 加上哨兵位 的话会简单很多,如果不加的话,还需要分情况一下,像是从头节点开始反转还是头节点以后开始反转,有了哨兵位后就只有一种情况了。 malloc一个

    2024年02月11日
    浏览(25)
  • 剑指 Offer II 024. 反转链表(经典题型)

    时间是伟大的作者,她能写出未来的结局。                               ——卓别林 目录 题目描述: 方法1:迭代法(翻指针) 方法2:头插法  方法3:递归法  给定单链表的头节点 head ,请反转链表, 并返回反转后的链表的头节点 。 示例 1: 输入:head = [1,2,3,4,5]

    2023年04月09日
    浏览(25)
  • 【leetcode】541. 反转字符串 II

    给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。 如果剩余字符少于 k 个,则将剩余字符全部反转。 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。 解答:

    2024年02月15日
    浏览(29)
  • leetcode-541. 反转字符串 II

    2024年02月16日
    浏览(27)
  • 【数据结构-链表-01】反转链表

    💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学习,不断总结,共同进步,活到老学到老 导航 檀越剑指大厂系列:全面总

    2024年02月10日
    浏览(33)
  • 【Leetcode】重排链表、旋转链表、反转链表||

    目录 💡重排链表 题目描述 方法一: 方法二: 💡旋转链表 题目描述 方法: 💡反转链表|| 题目描述 方法: 💡总结 给定一个单链表  L   的头节点  head  ,单链表  L  表示为:  L0 → L1 → … → Ln-1 → Ln  请将其重新排列后变为: L0 → Ln → L1 → Ln-1 → L2 → 

    2024年02月03日
    浏览(72)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包