[LeetCode]92. 反转链表 II

题目

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

说明:
1 ≤ m ≤ n ≤ 链表长度。

题解

  • 核心反转的部分和反转链表每k个节点是相同的。抽象为反转beg到end ,并连接l、r,即需要参数(l,beg,end,r。);pre初始化为beg,cur初始化为end,前提是保证beg end部分至少有两个节点。然后反转内部用反转的三个指针的方法走即可。

  • 为了保证区间反转代码至少含含两个节点(m<n),m==n特例直接return。

  • 加一个临时头节点。

  • 综上。1 判m==n;2 加临时头节点;3 找到l的位置 4 初始化lNext位置(为连接两端准备),初始化pre、cur、next,然后开始区间反转。

代码

class ListNode {
   int val;
   ListNode next;
   ListNode(int x) { val = x; }
}


public class Main {
	public static void main(String args[]) {
		//test
		ListNode n1=new ListNode(1);
		ListNode n2=new ListNode(2);
		ListNode n3=new ListNode(3);
		ListNode n4=new ListNode(4);
		ListNode n5=new ListNode(5);
		n1.next=n2;
		n2.next=n3;
		n3.next=n4;
		n4.next=n5;
		ListNode head=n1;
		
		ListNode newHead=reverseBetween(head,2,4);
		ListNode pNode=newHead;
		while(pNode!=null) {
			System.out.println(pNode.val);
			pNode=pNode.next;
		}
	}
	
	public static ListNode reverseBetween(ListNode head, int m, int n) {
        if(m==n){
            return head;
        }
        
        ListNode tempHead=new ListNode(-1);
        tempHead.next=head;
        
        ListNode l=tempHead;
        for(int i=1;i<m;++i){
            l=l.next;
        }
        
        ListNode pre=l.next; ListNode lNext=l.next;
        ListNode cur=pre.next;
        ListNode next=null;
        for(int i=m;i<n;++i){
            next=cur.next;
            cur.next=pre;
            pre=cur;
            cur=next;
        }
        
        l.next=pre;
        lNext.next=cur;
        
        return tempHead.next;
    }
}
原文地址:https://www.cnblogs.com/coding-gaga/p/11217952.html