反转部分链表
要求:给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。
我们来分析一下这个题,反转链表中的部分节点,也就是说有一部分不变,有一部分变,所以我们要记录下变的那部分节点前后两个节点的节点指针,然后反转链表,最后再连接即可。这里存在一种情况,就是Lift为第一个节点的情况,这种情况就只需要记录第right+1的节点指针了。
这里用了四个指针,有点多。。(p指针是前指针,pNext是比p快一步的后指针,pone是记录p指针的前一位置的指针,temp指针是锚点指针,记录Lift的前一个节点的位置)
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseBetween(struct ListNode* head, int left, int right){
struct ListNode *p = head; //前指针
struct ListNode *pNext = head; //后指针
struct ListNode *pone = head; //工具指针
struct ListNode *temp = head; //锚点指针(锚住Lift前面的第一个节点的位置)
int i=0; //设置变量
int res=left; //res保存lift的值
pNext = p->next; //pNext先走一步
if(right==left) //排除相等的情况
{ return head;}
for(i=1;i<left;i++){
temp = p; //temp指针指向Lift前一个位置
p = p->next; //实现运动p指针到Lift的位置
}
pNext = p->next; //pNext比p先走一步
pone = p; //pone指向p
while(res<right) //反转链表
{
p = pNext; //p运动到pNext的位置
pNext = pNext-> next; //pNext运动到一下位置
p->next = pone; //反转一个节点
pone = p; //pone移动到p的位置
res=res+1; //计数器加一
}
if(left!=1) //当Lift不为1时表示需要连接左右两个节点
{
temp->next ->next = pNext; //连接后面节点
temp->next = pone; //连接前面节点
return head; //返回头指针
}
if(left==1) //当pNext为1时
head->next = pNext; //只需要连接后节点
return p; //返回p指针
}