算法1
思路:需要先了解链表逆置这个原理,这个然后这个题,是在链表逆置中间取一段,我们需要设置一个虚拟头结点,for循环那段就是把链表方向转换,这里一共用到了五个指针,虚拟头结点dummy,一个节点停在left的前一个节点,b,c节点就是进行转换,d用于临时保存
C++ 代码
/**
* 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) {
auto dummy=new ListNode(-1);//建立一个虚拟头结点,令初值为-1
dummy->next =head;
auto a=dummy;//让a从虚拟头结点开始走,走到left前一步
for(int i=0;i<left-1;i++)a=a->next;
auto b=a->next,c=b->next;
for(int i=0;i<right-left;i++)//这个循环的作用是把left->right之间的指针逆转
{
auto d=c->next;//d用来保存c的next
c->next=b;
b=c;
c=d;
}
//这两步是相当巧妙
a->next->next=c;//由于a一直没变,然后需要将a下一个节点的下一个节点指向right的下一个,就是这里的c
a->next=b;//让a的下一个指向right那
return dummy->next;//这里是因为虚拟头结点是head的前一个节点
}
};