原理很简单:就是把中间要反转的部分截取出来反转后,再放回去,放回去时注意pre的下个结点是right,而left的下个结点是succ;
下方是部分代码实现,如果想看整体代码建议去看我的另一篇文章https://blog.csdn.net/qq_41884662/article/details/114994357,[将此代码加上里边的代码即可实现整体结构]
ListNode* reverseBetween(ListNode* head, int left, int right) {
ListNode* headnode = CreateListNode(-1); // 因为头节点有可能发生变化,所以首先要创建一个虚拟节点
headnode->m_pNext = head;
ListNode* curr = headnode;
for (int i = 0; i < left - 1; i++) { // 第 1 步:从虚拟头节点走 left - 1 步,来到 left 节点的前一个节点
curr = curr->m_pNext;
}
ListNode* leftNode = curr->m_pNext;
ListNode* pre = curr;//pre为left结点前一个节点
for (int i = 0; i < right - left + 1; i++) { // 第 2 步:从 curr再走 right - left + 1 步,来到 right 节点
curr = curr->m_pNext;
}
ListNode* rightNode = curr;
ListNode* succ = curr->m_pNext;//succ结点为right结点后一个结点
rightNode->m_pNext =NULL;// 第 3 步:切断出一个子链表(截取链表),注意要把ll和right的下一个节点都设置为null
pre->m_pNext =NULL;
reverseList(leftNode);// 第 4 步:反转链表的子区间
pre->m_pNext = rightNode;// 第 5 步:接回到原来的链表中
leftNode->m_pNext = succ;
return headnode->m_pNext;
}
int main()
{
A* x = new A;
ListNode* pNode1 =x->CreateListNode(1);//创建一个结点
//x->PrintList(pNode1);//打印
//往链表中添加新结点
x->AddToTail(&pNode1, 2);//为链表添加一个结点
x->AddToTail(&pNode1, 3);//为链表添加一个结点
x->AddToTail(&pNode1, 4);//为链表添加一个结点
x->AddToTail(&pNode1, 5);//为链表添加一个结点
//x->AddToTail(&pNode1, 7);//为链表添加一个结点
//打印链表
x->PrintList(pNode1);//打印
//反转链表
ListNode* pReversedHead = x->reverseBetween(pNode1,2,4);
x->PrintList(pReversedHead);//打印
system("pause");
}
结果显示: