【Leetcode】Reverse Linked List II in JAVA

Reverse a linked list from position m to n. Do it in-place and in one-pass.

For example:
Given 1->2->3->4->5->NULLm = 2 and n = 4,

return 1->4->3->2->5->NULL.

Note:
Given mn satisfy the following condition:
1 ≤ m ≤ n ≤ length of list.

我的思路也非常简单~

1.两个指针,m和n分别指向m-1和n-1

2.生成一个mPre,在m-2

3.把m放到后面,直到mNode==nNode

4.如果mNode==head,算法要重新搞,其实mPre==mNode就好了


public class reverseLL {
	
public static void main(String args[]){
	reverseLL rs= new reverseLL();
	ListNode l1 = new ListNode(3);
	ListNode l2 = new ListNode(5);
//	ListNode l3 = new ListNode(3);
//	ListNode l4 = new ListNode(4);
//	ListNode l5 = new ListNode(5);
	l1.next=l2;
//	l2.next=l3;
//	l3.next=l4;
//	l4.next=l5;
	rs.print(l1);
	rs.reverseBetween(l1, 1, 2);
	rs.print(l1);
}

	public void print(ListNode head){
		while(head!=null){
			System.out.print(head.val+"->");
			head=head.next;
		}
		System.out.println();
	}
	
	
	
//	Given 1->2->3->4->5->NULL, m = 2 and n = 4,
//
//			return 1->4->3->2->5->NULL.
	
	    public ListNode reverseBetween(ListNode head, int m, int n) {
	       ListNode mNode = head;
	       ListNode nNode = head;
	       ListNode mPre = new ListNode(0);
	       
	       //let n be position n-1, m be m-1, mPre be m-2
	       for(int i=0;i<n-m;i++)	nNode=nNode.next;
	       for(int j=0;j<m-1;j++){
	    	   mPre = mNode;
	    	   mNode=mNode.next;
	    	   nNode=nNode.next;
	       }
	       
	       //if from the head, solution would be different
	       if(mNode==head)	{
	    	   while(mNode!=nNode){
	    	   mPre=mNode;
	    	   mNode=mNode.next;
	    	   mPre.next=nNode.next;
	    	   nNode.next=mPre;
	    	   }
	    	   return mNode;
	       }
	       
	       //normal way of reversing
	       while(mNode!=nNode){
	    	   ListNode tmp = mPre;
	    	   tmp.next=mNode.next;
	    	   mNode.next=nNode.next;
	    	   nNode.next=mNode;
	    	   mNode=mPre.next;
	    	   
	       }
	       
	       return head;
	       }
	    	
	    	
	}


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值