[LeetCode] 92. Reverse Linked List II

原题链接: https://leetcode.com/problems/reverse-linked-list-ii/

1. 题目介绍

Reverse a linked list from position m to n. Do it in one-pass.
Note: 1 ≤ m ≤ n ≤ length of list.

给出一个链表,以及数字 m、n。反转 [m , n ] 部分的链表。使用一次循环。
1 ≤ m ≤ n ≤ length length 是链表的长度
Example:

Input: 1->2->3->4->5->NULL, m = 2, n = 4
Output: 1->4->3->2->5->NULL

2. 解题思路

这个题是 206. Reverse Linked List 的加强版。206. Reverse Linked List 是反转整个链表,而本题是反转[ m , n ]那一段的节点。

注:下面的方法参考了 https://www.cnblogs.com/grandyang/p/4306611.html 的解法

我们需要设置两个指针,一个指针是pre ,指向第 m-1 个节点;一个指针是 cur ,指向第 m 个节点。
这个方法的主要思路是,依次把 cur 后面的节点放到第 m-1 个节点的后面。

  1. 首先把pre 指向第 m-1 个节点;cur,指向第 m 个节点,assist是最前面的辅助节点
    在这里插入图片描述

  2. 然后依次将cur后面的第一个节点移动到pre后面,cur继续指向后面的第二个节点。这个步骤要重复 n-m 次。
    在这里插入图片描述
    在这里插入图片描述

  3. 之后直接返回 assist.next 就是正确的结果了。

实现代码

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode reverseBetween(ListNode head, int m, int n) {
		if(head == null || m == n || head.next == null){
			return head;
		}
		
		ListNode assist = new ListNode(0);
		assist.next = head;
		
		//让 pre 指向第 m-1 个节点,cur指向第 m 个节点
		ListNode pre = assist;
		for(int i = 0 ; i < m-1 ; i++){
			pre = pre.next;
		}
		ListNode cur = pre.next;
		
		//把 cur 后面的节点依次放到pre后面		
		for(int i = 1; i <= n-m; i++){
			ListNode temp = cur.next;
			cur.next = temp.next;
			temp.next = pre.next;
			pre.next = temp;
		}
		
		return assist.next;
    }
}

3. 参考资料

https://www.cnblogs.com/grandyang/p/4306611.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值