链表指定区间反转-java
链表内指定区间反转
http://www.nowcoder.com/questionTerminal/b58434e200a648c589ca2063f1faf58c
解题思路
将链表分为三个部分:前m-1个节点、中间n-m+1个节点、第n个节点之后的部分
Step1: 前m-1个节点尾插法插入到新的链表
Step2: 以Step1的结果的最后一个结点作为头将中间n-m+1个以头插法插入,并记录尾结点。
Step3: 将剩余部分拼接到Step2的结果尾结点后。
public ListNode reverseBetween (ListNode head, int m, int n) {
// write code here
ListNode newHead = new ListNode(-1);
newHead.next = head;
ListNode p1 = newHead;
// 尾插法插入m-1个节点
for(int i=1; i<m && null != p1; ++i) {
p1 = p1.next;
}
// 头插法插入 n-m+1个节点
ListNode cur = p1.next;
p1.next = null;
ListNode tail = null;
for(int i=1; i<= n-m+1 && cur != null; ++i) {
ListNode tempNode = cur;
cur = cur.next;
tempNode.next = p1.next;
p1.next = tempNode;
// 记录头插法产生端的尾结点
if(null == tail) {
tail = tempNode;
}
}
tail.next = cur;
return newHead.next;
}
汤臣倍健公司氛围 388人发布