给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。
来源:力扣(LeetCode)
链接:力扣原题链接
//反转部分链表
ListNode *reverseBetween(ListNode *head, int left, int right)
{
_dummyHead->next=head;//虚头的下个指针指向头
ListNode*pre=_dummyHead;//
for(int i=0;i<left-1;i++)
{
pre=pre->next;//找到left指向位置的前个位置
}
ListNode*cur=pre->next;
for(int i=0;i<right-left;i++)
{
ListNode*next=cur->next;
//三步走,走完之后移动next指针
cur->next=next->next;
next->next=pre->next;
pre->next=next;
}
return head;
}
代码思路:如图所示:
思路讲解:
设置三个指针,分别为
pre:指向left的前一个节点,该位置不变;
cur:最初指向left的位置,每反转一个元素就会右移一位;
next:最初指向left的下个位置,每反转一个元素就会右移一位;
每次反转就会把next指向的节点,转到pre指向的下个位置;
测试代码:
/*************************************************************************
> File Name: 6-链表部分反转.cpp
> Author:
> Mail:
> Created Time: Mon 28 Mar 2022 02:29:45 PM CST
************************************************************************/
#include<iostream>
using namespace std;
class Solution
{
public:
struct ListNode
{
int val;
struct ListNode*next;
ListNode(int val):val(val),next(nullptr){}
};
//1. 在链表最前面插入一个节点,插入完成后,新插入的节点为链表的新的头结点
ListNode*addAtHead(int val)
{
ListNode* newNode = new ListNode(val);
newNode->next = _dummyHead->next;
_dummyHead->next = newNode;
return _dummyHead->next;
}
//尾插法
ListNode*addeare(int val)
{
ListNode* newNode = new ListNode(val);
ListNode* pre=_dummyHead;
while(pre->next!=nullptr)
{
pre=pre->next;
}
//退出循环说明pre的下个位置为空,即链表队尾
pre->next=newNode;
return _dummyHead->next;//返回头
}
// 2.打印链表
void printLinkedList()
{
ListNode* cur = _dummyHead;
while (cur->next != nullptr)
{
cout << cur->next->val << " ";
cur = cur->next;
}
cout << endl;
}
//反转部分链表
ListNode *reverseBetween(ListNode *head, int left, int right)
{
_dummyHead->next=head;//虚头的下个指针指向头
ListNode*pre=_dummyHead;//
for(int i=0;i<left-1;i++)
{
pre=pre->next;//找到left指向位置的前个位置
}
ListNode*cur=pre->next;
for(int i=0;i<right-left;i++)
{
ListNode*next=cur->next;
//三步走,走完之后移动next指针
cur->next=next->next;
next->next=pre->next;
pre->next=next;
}
return head;
}
ListNode* _dummyHead= new ListNode(0); //虚头
};
int main()
{
// 反转前: 1 2 3 4 5 6 7 8
// 反转后: 1 2 7 6 5 4 3 8
Solution s;
s.addeare(1);
s.addeare(2);
s.addeare(3);
s.addeare(4);
s.addeare(5);
s.addeare(6);
s.addeare(7);
Solution::ListNode*head=s.addeare(8);
s.printLinkedList();//打印反转前数据
Solution::ListNode* ret=s.reverseBetween(head,3,7);
s.printLinkedList();//打印反转后数据
// Solution::ListNode*p=ret;
// while(p)
// {
// cout<<p->val<<" ";
// p=p->next;
// }
// cout <<endl;
return 0;
}