反转从位置 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;
}
}