92.反转链表II & 206.反转链表

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;
    }

};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值