- 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.
参考链接:http://www.jiuzhang.com/solutions/reverse-linked-list-ii/
本题的思路是:可以在单链表中插入头节点,从而对链表中第一个节点的逆置和对后面节点的逆置操作一样
ListNode* reverseBetween(ListNode* head, int m, int n) {
if(NULL == head || m>n)
{
return head;
}
ListNode* newList = new ListNode(0); //把单链表插入头节点,从而使得如果m=1的操作同m=2,3....等的操作一样
newList->next = head;
head = newList; //注意该句不能丢!!!!!!!!!!!!!!
for(int i = 1; i < m; i++)
{
if(NULL == head)
{
return NULL;
}
head = head->next;
}
ListNode* pprev = head;
ListNode* mnode = head->next;
ListNode* nnode = mnode;
ListNode* nnodenext = nnode->next;
for(int i = m; i < n; i++)
{
if(nnodenext == NULL)
{
return NULL;
}
ListNode* temp = nnodenext->next;
nnodenext->next = nnode;
nnode = nnodenext;
nnodenext = temp;
}
mnode->next = nnodenext;
pprev->next = nnode;
return newList->next;
}