翻转链表2
一共需要四个关键节点,要反转的第一个节点的前驱节点,要反转的第一个节点,要反转的最后一个节点,最后一个节点的后一个节点
主要思路就是先求得前两个关键节点,然后需要求出翻转的链表的长度,进行翻转的过程,这里的技巧跟单纯翻转单链表一样,不多说了。
注意:当需要翻转的节点从头结点开始的话,就是需要特殊处理。
代码:
/**
* 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) {
//翻转链表有界限的
int len=n-m+1;
ListNode* prehead=NULL;
ListNode* pNext=NULL;
ListNode* modify_tail=head;
ListNode* new_head=NULL;
ListNode* phead=head;
//达到了第m个数字
while(phead&&--m)//减少次数,如果m是1的话,就没有赋值modify了
{
prehead=phead;
phead=phead->next;
modify_tail=phead;//记录下来翻转的尾结点
}
while(head&&len--)
{
pNext=phead->next;
phead->next=new_head;
new_head=phead;
phead=pNext;
}
if(prehead)
{
modify_tail->next=pNext;
prehead->next=new_head;
return head;
}
else
{
modify_tail->next=pNext;
return new_head;
}
}
};