您的位置:首页 > 其它

[leetcode]Reverse Linked List II

2017-05-25 22:28 609 查看
Reverse Linked List II

Difficulty:Medium

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.

题目就是要逆置链表中的一段,并且要求空间负责都为O(1),并且一次遍历处理完。
首先是找到逆置段的前一个节点,从逆置段的第二个节点开始,按顺序把要逆置的节点插入到逆置段的前一个节点后面,直到逆置段结束。
比如题目的例子,逆置段前一个节点是节点1,那这里的第一步就是把节点3插入到节点1后面:1->3->2->4->5 ; 第二步就是把节点4插入到节点1后面:1->4->3->2->5,通过这两部步就完成了逆置。
ListNode* reverseBetween(ListNode* head, int m, int n) {
if (head == NULL)
return NULL;
if (m == n)
return head;

ListNode newHead(0);//新的头 以防m为0时需要从头开始逆置
newHead.next = head;
ListNode *p = &newHead,*reverseHead=NULL,*current=NULL;

for(int i = 0; i < m - 1; i++)//找到开始逆置的前一个位置
p = p->next;

reverseHead = p;//保存开始逆置的前一个位置

p=p->next;
current = p->next;
for(int i = m;i<n;i++){//把要逆置的节点不断插入到reverseHead后面
p->next = current->next;
current->next = reverseHead->next;
reverseHead->next = current;
current = p->next;
}

return newHead.next;
}

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: