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:
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
思路:找到起始节点m的前一个节点,在m和n之间的节点使用插入发来进行逆值,然后再链接起来
代码如下:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int m, int n) {
if(!head||!head->next||m<1||m>n)//直接返回的条件
return head;
ListNode *dummy=new ListNode(0);
dummy->next=head;
head=dummy;
for(int i=0;i<m-1;i++) //记录起始拟置节点的位置
head=head->next;
ListNode *pre=head->next,*cur=pre->next;
for(int i=0;i<n-m;i++)
{
ListNode *tmp=cur->next;
cur->next=pre;
pre=cur;
cur=tmp;
}
head->next->next = cur;
head->next = pre;
head = dummy->next;
delete dummy;
return head;
}
};