翻转链表的指定区间
这道题要求我们只翻转链表中指定区间的节点,解题思路为:找到left节点使用curr来指向,然后使用pre指向它前一个节点,然后依次将curr后面的节点使用头插法插到pre的后面。使用哨兵头结点来避免对链表是否为空的讨论。
代码
class Solution {
public:
/**
*
* @param head ListNode类
* @param m int整型
* @param n int整型
* @return ListNode类
*/
ListNode* reverseBetween(ListNode* head, int m, int n) {
// write code here
//指定区间链表反转,使用双指针法
ListNode* temphead=new ListNode(-1);
temphead->next=head;
int num=n-m+1;
ListNode* curr=temphead,*pre=nullptr;
while(m){
pre=curr;
curr=curr->next;
m--;
}
ListNode* next=nullptr;
//使用头插法依次将curr后面的节点插入到pre后面去,要循环n-m-1次
//一定要注意指针变换的先后顺序!
for(int i=0;i<num-1;i++){
next=curr->next; //先保存curr的下一个节点
curr->next=next->next; //将curr指向下一个节点的下一个节点
next->next=pre->next; //将下一个节点插入pre的后面,即先将next的next指针指向pre的下一个节点
pre->next=next; //然后将pre->next指向next;即实现了将next节点插入pre的后面。
}
return temphead->next;
}
};