http://oj.leetcode.com/problems/reverse-linked-list-ii/
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->NULL, m = 2 and n = 4,
return 1->4->3->2->5->NULL.
Note:
Given m, n satisfy the following condition:
1 ≤ m ≤ n ≤ length of list.
For example:
Given 1->2->3->4->5->NULL, m = 2 and n = 4,
return 1->4->3->2->5->NULL.
Note:
Given m, n satisfy the following condition:
1 ≤ m ≤ n ≤ length of list.
在剑指offer中看到过反转链表,里面讲的思想稍稍复杂一点,是在原链表中进行反转操作,但是我拿到这道题的第一印象就是用头插法生成新的链表,并将新建链表查到原来链表的相应位置中。思想很简单明了,但是代码略长。
public ListNode reverseBetween(ListNode head, int m, int n) {
if(m == n || head == null){
return head;
}
//------ 手动添加头结点,为了操作统一性
ListNode phead = new ListNode(0);
phead.next = head;
ListNode tem = phead;
int count = 0;
//需要记录m ,n前后的两个节点,方便新链表的插入
ListNode newList = new ListNode(0);
ListNode mPreNode = null;
ListNode nPreNode = null;
ListNode tail = null;
while(tem != null) {
if(count == m - 1){
if(m == 1){
mPreNode = phead;
}else{
mPreNode = tem;
}
}else if (count == n + 1){
nPreNode = tem;
}else if(count <= n && count >= m){
//头插法建表
ListNode node = new ListNode(tem.val);
node.next = newList.next;
newList.next = node;
if(count == m){
tail = node;
}
}
count++;
tem = tem.next;
}
mPreNode.next = newList.next;
tail.next = nPreNode;
return phead.next;
}