参考大佬的进行了代码优化,两种实现
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; } }