参考大佬的进行了代码优化,两种实现
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* }
*/
public class Solution {
/**
*
* @param head ListNode类
* @param m int整型
* @param n int整型
* @return ListNode类
*/
public ListNode reverseBetween (ListNode head, int m, int n) {
if(head==null||head.next==null){
return head;
}
if((n-m)<1){
return head;
}
ListNode tmpHead=new ListNode(0);
tmpHead.next=head;
ListNode start=head;
ListNode pStart=tmpHead;
for(int i=1;i<m;i++){
start=start.next;
pStart=pStart.next;
}
for(int i=0;i<n-m;i++){
//记录要翻转的节点
ListNode next=start.next;
//删除要翻转的节点
start.next=start.next.next;
next.next=pStart.next;
//将要翻转的节点放入 pStart 下一个节点,这个过程类似于入栈,所以可以翻转 pStart 始终不变
pStart.next=next;
}
return tmpHead.next;
}
public ListNode reverseBetweenOld (ListNode head, int m, int n) {
// write code here
if(head==null||head.next==null){
return head;
}
if((n-m)<1){
return head;
}
int i=1;
ListNode tmpHead=new ListNode(0);
tmpHead.next=head;
head=tmpHead;
tmpHead=head.next;
ListNode tmpHeadPre=head;
//初始化待翻转子列表头及头前驱节点
while(i<m&&tmpHead!=null){
tmpHeadPre=tmpHeadPre.next;
tmpHead=tmpHead.next;
i++;
}
//开始翻转 记录当前翻转前一个节点以便翻转后拼接
ListNode fHeadPre=tmpHeadPre;
//翻转链表尾节点
ListNode fTail=tmpHead;
//前驱节点
ListNode pre=null;
while(i<n&&tmpHead!=null){
ListNode next=tmpHead.next;
tmpHead.next=pre;
pre=tmpHead;
tmpHead=next;
i++;
}
//循环后还差一次翻转
ListNode next=null;
if(tmpHead!=null){
next=tmpHead.next;
tmpHead.next=pre;
pre=tmpHead;
tmpHead=next;
}
//链接无需翻转后续的链表
fTail.next=next;
//拼接翻转链表
fHeadPre.next=pre;
return head.next;
}
}
京公网安备 11010502036488号