反转链表指定位置

耗尽温柔 提交于 2020-03-01 21:17:35

题目

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

  • 说明:
    1 ≤ m ≤ n ≤ 链表长度。
  • 示例:
    输入: 1->2->3->4->5->NULL, m = 2, n = 4
    输出: 1->4->3->2->5->NULL

题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-linked-list-ii

算法思路

首先找到要反转的位置,从n位置开始。
要反转一个结点cur:

  • 要使用prev引用记住它的前结点
  • 再一个curNext引用记住它的后驱结点
  • 反转下一个时,更新prev和curNext

反转2~4位置结点
在这里插入图片描述
到这里还没有结束:
在这里插入图片描述
还需要将1的next改为4结点
2的next改为5结点

所以最开始之前,必须借用front引用保存m位置的前驱prev。
找到m位置后,使用引用rear保存此节点。

在这里插入图片描述

最后改变引用指向:

  • 这里还要注意m位置若是从1开始的画front==null,本例中表示从1开始,但要把这种情况考虑进去。
  • 最后分两种情况:
    (1)front==null: 此时头结点变为prev,rear.next=cur;
    (2)front!=null:front.next=prev,rear.next=cur.

代码

class Solution {
    public ListNode reverseBetween(ListNode head, int m, int n) {
	     if(head==null){
	         return null;
	     }
	     ListNode cur=head;
	     ListNode prev=null;
	     while(m>1){
	         prev=cur;
	         cur=cur.next;
	         m--;
	         n--;
	     }
	
	     ListNode front=prev;
	     ListNode uu=cur;
	     ListNode curNext=null;
	     while(n>0){
	        
	         curNext=cur.next;
	         cur.next=prev;
	         prev=cur;
	         cur=curNext;
	         n--;
	     }
	      
	     if(front!=null){
	         front.next=prev;
	
	     }
	     else{
	         head=prev;
	     }
	
	     uu.next=cur;
	     return head;
    }
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!