链接:http://leetcode.com/onlinejudge#question_92
原题:
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.
思路:
1)if head == NULL || m == n,直接return
2)当 m < n时候,当串起来的时候,要小心head也可能被翻转了,别的没有什么注意点,仔细点就可以一次A掉了。
代码:
/** * 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) { // Start typing your C/C++ solution below // DO NOT write int main() function if (head == NULL || m == n) return head; ListNode *start = head; ListNode *firstTail = NULL; int i; for (i=1; i<m; i++) { firstTail = start; start = start->next; } ListNode *pre = start; ListNode *cur = start->next; while (i<n) { ListNode *succ = cur->next; cur->next = pre; pre = cur; cur = succ; i++; } if (firstTail) firstTail->next = pre; else head = pre; start->next = cur; return head; } };
又写了一个,呵呵。
/** * 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) { // Start typing your C/C++ solution below // DO NOT write int main() function if (m == n) return head; ListNode *cur = head; ListNode *pre = NULL; int count = 1; while (count < m) { pre = cur; cur = cur->next; count++; } ListNode *tail1 = pre; ListNode *tail2 = cur; pre = NULL; while (count <= n) { ListNode *succ = cur->next; cur->next = pre; pre = cur; cur = succ; count++; } tail2->next = cur; if (tail1) tail1->next = pre; else head = pre; return head; } };