92.反转链表II & 206.反转链表
206.
思路:
定义三个指针pre和cur和tmp
tmp暂时记录cur->next,因为反转时cur的next指针会指向pre,不记录后半段就访问不到了
代码:
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* pre=nullptr;
ListNode* cur=head;
while(cur!=nullptr){
ListNode* tmp=cur->next;
cur->next=pre; //cur指向前一个 反转
pre=cur;//pre右移
cur=tmp; //cur右移
}
//curc此时是nullpr,pre刚好是原链表最后一个结点
return pre;
}
};
92.
思路:
分成三部分头,中,尾,将中间反转后分别接起来
1.创建dummy结点
2.cur从dummy开始遍历到left左侧的结点(count=0到count<left-1)
3.出while循环时,cur位于left左侧,记录为leftHead, 记录cur->next(left处的)为leftTail
4.leftHead为头部分最后一个(作为“head”接上下一段),leftTail为中间部分反转后的最后一个(继续接尾部分)
5.将cur移动到left位置处,对中间部分进行反转同206题,循环条件count<=right,count=right时cur在right处
6.while时,pre在right处,cur在right->next处,此时cur刚好时尾部分第一个
7.拼接三部分,头部分的最后(leftHead)接上反转后的第一个(pre),反转后的最后一个(leftTail)接尾部分的第一个(cur)
8.返回dummy->next,因为在left=1即left是head时,head会被改变
代码:
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int left, int right) {
if(left==right) return head;
ListNode* dummy=new ListNode(0);
dummy->next=head;
ListNode* cur=dummy;
int count=0;
while(count<left-1){
cur=cur->next;
count++;
}
ListNode* leftTail=cur;//记录left的前一个结点
ListNode* leftHead=cur->next;//记录left处的结点
ListNode* pre=nullptr;
cur=cur->next; //left位置处的
count=count+1;
while(count<=right){ //count=right时cur在right处
ListNode* tmp=cur->next;
cur->next=pre;
pre=cur;
cur=tmp;
count++;
}
//此时cur是right右侧的结点,pre是反转部分的head
leftTail->next=pre;
leftHead->next=cur;
return dummy->next;
}
};