题目:
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.
思路:
今天选一道看上去不怎么难得题目。这题乍一看,反转链表,很多人一看就有思路,但是这题有非常多的边界问题要考虑。要把所有的情况都考虑到并非易事,今天也是因此选这道题记在博客上,这题也花了我差不多30分钟(其实我写复杂了,还有一种比较简单的方法是直接把后面的节点用头插法插入到n前面)。不过我是一次AC的(我刷题可是从来不用IDE的哦~),由此可见在做题或者工作中写模块前先考虑好单元的测试用例并且写完后进行单元测试是有多重要!
AC截图:
代码:
/**
* 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 == NULL)
{
return NULL;
}
ListNode *begin=head;
ListNode *end=head;
for(int i=1; i<m-1; i++)
{
begin=begin->next;
}
for(int i=1; i<n; i++)
{
end=end->next;
}
if(m != 1)
{
reverse(begin->next,end);
begin->next=end;
return head;
}
else
{
reverse(begin,end);
return end;
}
}
void reverse(ListNode *begin, ListNode *end)
{
if(begin == end)
{
return;
}
ListNode *pCurrent=begin;
ListNode *pPre=NULL;
ListNode *pNext=NULL;
ListNode *head=NULL;
ListNode *nextEnd=end->next;
while(pCurrent!=nextEnd)
{
pNext=pCurrent->next;
pCurrent->next=pPre;
pPre=pCurrent;
pCurrent=pNext;
}
begin->next=pCurrent;
}
};
本博客内容与代码均为作者Jarvis原创,如若转载请注明。