JAVA程序设计: 反转链表 II(LeetCode:92)

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

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

示例:

输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL

方法一:直接开两个指针,递归交换即可。

class Solution {
	
	private boolean stop;
	private ListNode left;
	
	public void recurseAndReverse(ListNode right,int m,int n)
	{
		if(n==1)
			return;
		
		right=right.next;
		
		if(m>1)
			left=left.next;
		
		this.recurseAndReverse(right, m-1, n-1);
		
		if(this.left==right || right.next==this.left)
			this.stop=true;
		
		if(!this.stop)
		{
			int t=this.left.val;
			this.left.val=right.val;
			right.val=t;
			
			this.left=this.left.next;
		}
	}
    public ListNode reverseBetween(ListNode head, int m, int n) {
       
    	this.left=head;
	    this.stop=false;
	    this.recurseAndReverse(head, m, n);
	
	    return head;
    }
}

方法二:迭代链接反转

具体的反转过程见:https://leetcode-cn.com/problems/reverse-linked-list-ii/solution/fan-zhuan-lian-biao-ii-by-leetcode/

class Solution {
    public ListNode reverseBetween(ListNode head, int m, int n) {
    	
    	if(head==null)
    		return head;
    	
    	ListNode prev=null,cur=head;
    	
    	while(m>1)
    	{
    		m--;n--;
    		prev=cur;
    		cur=cur.next;   		
    	}
    	
    	ListNode con=prev,tail=cur;
    	
    	ListNode Third=null;
    	while(n>0)
    	{
    		Third=cur.next;
    		cur.next=prev;
    		prev=cur;
    		cur=Third;
    		n--;
    	}
    	
    	if(con!=null)
    		con.next=prev;
    	else
    		head=prev;
    	
    	tail.next=cur;
    	
    	return head;
    }
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值