目录
1.问题描述
本体出自leetcode 92 反转链表Ⅱ,相比于反转链表Ⅰ,题目增加了两个输入变量left和right,要求反转的是链表的[left,right]区间。
2.解决思路
由于要求是反转区间里面的节点,相比于反转整个链表,我们需要考虑的点也更多了,比如反转的区间是第一个怎么办?反转区间里面的,那么不是区间里面的节点该怎么考虑?是不是应该设置反转的前置节点?我们需要找到反转区间的第一个节点,反转后的下一个节点。把中间反转后,首尾相连即可。
3.代码实现
ListNode* reverseBetween(ListNode* head, int left, int right) {
ListNode *reverstart=NULL;//反转的起始节点
ListNode *reverend=head;//反转的结尾节点
ListNode *node=head;//用于遍历的节点,遍历至反转的第一个节点
while(--left)
{
reverstart=node;//记录node的前一个节点
node=node->next;
}
while(right--)
{
reverend=reverend->next;
}
ListNode* pre=nullptr;//用于反转的节点
while(node!=reverend)
{
ListNode *nextnode=node->next;
node->next=pre;
pre=node;
node=nextnode;
}
//如果reverstart!=nullptr说明需要反转的节点就是第一个
if(reverstart!=nullptr)
{
reverstart->next=pre;
}
else
{
head=pre;
}
while(pre && pre->next)
{
pre=pre->next;
}
if(pre)
pre->next=reverend;
return head;
}
4.总结
虽然只相对于普通的反转链表只加了一个区间,但是也复杂了不少,尤其是reverstart节点那里需要注意判断,如果是第一个节点,那么最后返回的节点就不是head,应该是在链表区间反转前的第一个。