Reverse Linked List II
Q: 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.
A: 要小心循环次数!
ListNode *reverseBetween(ListNode *head, int m, int n) { // Start typing your C/C++ solution below // DO NOT write int main() function if(m==n||!head) return head; ListNode *tail = NULL,*prev = NULL,*cur,*temp,*next=NULL; //temp:reverse部分的head,tail:reverse部分的tail,prev:需要reverse部分的前一个节点 cur = head; int count = 0; while(count<m-1) { prev = cur; cur = cur->next; count++; } temp = tail = cur; cur = cur->next; while(count<n-1) { if(prev) prev->next = cur; next = cur->next; cur->next = temp; temp = cur; count++; cur = next; } tail->next = cur; return (prev?head:temp); }
思路完全一样,注意循环次数即可。
ListNode *reverseBetween(ListNode *head, int m, int n) {
// Note: The Solution object is instantiated only once and is reused by each test case.
if(m==n||!head)
return head;
ListNode* prev,*cur,*reverseHead,*reverseTail,*next;
prev = NULL;
int i;
reverseHead = head;
for(i=0;i<m-1;i++)
{
prev = reverseHead;
reverseHead = reverseHead->next;
}
ListNode* tmp = reverseHead;
next = reverseHead->next;
while(i<n-1)
{
cur = next;
next = cur->next;
cur->next = tmp;
tmp = cur;
++i;
}
reverseTail = cur;
reverseHead->next = next;
if(!prev)
return reverseTail;
else
{
prev->next = reverseTail;
return head;
}
}
void reverse(ListNode* prev,ListNode* next)
{
ListNode* last = prev->next;
ListNode* cur = last->next;
while(cur!=next)
{
last->next = cur->next;
cur->next = prev->next;
prev->next = cur;
cur = last->next;
}
}
ListNode *reverseBetween(ListNode *head, int m, int n) {
// Note: The Solution object is instantiated only once and is reused by each test case.
if(m==n||!head)
return head;
ListNode* dummy = new ListNode(0);
dummy->next = head;
ListNode* prev = dummy,*next;
int i = 0;
while(i<m-1)
{
prev = prev->next;
++i;
}
next = prev;
while(i<n+1)
{
next = next->next;
++i;
}
reverse(prev,next); //reverse一个区间
ListNode* newHead = dummy->next;
delete dummy;
return newHead;
/* ListNode* prev,*cur,*reverseHead,*reverseTail,*next;
prev = NULL;
int i;
reverseHead = head;
for(i=0;i<m-1;i++)
{
prev = reverseHead;
reverseHead = reverseHead->next;
}
ListNode* tmp = reverseHead;
next = reverseHead->next;
while(i<n-1)
{
cur = next;
next = cur->next;
cur->next = tmp;
tmp = cur;
++i;
}
reverseTail = cur;
reverseHead->next = next;
if(!prev)
return reverseTail;
else
{
prev->next = reverseTail;
return head;
}*/
}
浙公网安备 33010602011771号