题目:
给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。
思路:
记录代码前驱和后继,再将反转后的链表与前驱和后继相连
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int left, int right) {
int changeLen=right-left+1;//记录反转链表的长度
ListNode *preHead=NULL;//初始化前一节点为空
ListNode *result=head;//返回的结果链表
while(head && --left)//找到需要反转的链表前驱
{
preHead=head;
head=head->next;
}
ListNode *tailNode=head;//记录反转链表的头结点(反转后为尾节点)
//反转链表
ListNode *new_head=NULL;
while(head&&changeLen)
{
//迭代法反转链表
ListNode *next=head->next;
head->next=new_head;
new_head=head;
head=next;
changeLen--;//控制反转长度
}
tailNode->next=head;//将逆置后的最后一节点和后一个节点相连
if(preHead){
preHead->next=new_head;
}
else
{
result=new_head;
}
return result;
}
};