题目
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL
算法
public class P92 {
public ListNode reverseBetween(ListNode head, int m, int n) {
if(head==null||head.next==null||m==n){
return head;
}
int index = 1;
ListNode p = head;
if(m==1){
ListNode last = p;
ListNode first = null;
ListNode rpre = null;
while (p!=null&&index-1!=n){
ListNode q = p.next;
p.next = rpre;
rpre = p;
first = p;
p = q;
index++;
}
last.next = p;
return first;
}else {
//找到m前的一个数字
while(p!=null&&index+1!=m){
index++;
p = p.next;
}
ListNode s1 = p;
p = p.next;
index++;
ListNode last = p;
ListNode first = null;
ListNode rpre = null;
while (p!=null&&index-1!=n){
ListNode q = p.next;
p.next = rpre;
rpre = p;
first = p;
p = q;
index++;
}
s1.next = first;
last.next = p;
return head;
}
}
}
思路:
- 判断m=1是否成立,如果成立,最后返回的头结点不是head,而是中间的某个节点
- 找到链表中m到n的节点,通过设置前驱节点的方式将m到n出的链表反转过来