您的位置:首页 > 编程语言 > C语言/C++

leetcode Reverse Linked List II C++

2016-10-05 01:46 417 查看
关于这道题,discuss里面有很短的只有九行就AC的方法,确实比较精妙,这里给出一种比较容易的理解的解法,先将区间内的部分翻转,然后将翻转后的部分与其他部分按原来的顺序串联起来,但需要注意的是区间内是否包含头结点。

/**
* Definition for singly-linked list.
* struct ListNode {
*     int val;
*     ListNode *next;
*     ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* pre = NULL;
ListNode* next;
while(head != NULL)
{
next = head -> next;
head -> next = pre;
pre = head;
head = next;

}
return pre;

}
ListNode* reverseBetween(ListNode* head, int m, int n) {
ListNode* pre_reverse = NULL;  //指示翻转部分的前一个节点
ListNode* iter = head;
int temp_m = m;
while(--temp_m)
{
pre_reverse = iter;
iter = iter -> next;
}
ListNode* reverse_head = iter; //指示翻转部分的头结点
for(int i = m; i < n; i++)
{
iter = iter -> next;
}
ListNode* next_reverse = iter -> next; //指示翻转部分后的节点
iter -> next = NULL; // 完成待翻转部分的剥离
ListNode* new_head = reverseList(reverse_head);//翻转待翻转部分
iter = new_head;
while(iter -> next != NULL)
iter = iter -> next;
ListNode* new_tail = iter;
if(pre_reverse == NULL)   //翻转部分包含原来的头结点
{
new_tail -> next = next_reverse;  //重新连接
return new_head;
}
else
{
pre_reverse -> next = new_head;
new_tail -> next = next_reverse;
return head;
}

}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode