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; }*/ }