LeetCode刷题之no.92

关键知识

链表的处理

解答思路

题目要求将m到n区间内的结点逆序。做法是首先定位到第m个结点,然后记录好第m-1结点和第m个结点。从m开始,用pre,cur和next三个指针分别记录前一结点,当前结点和下一结点。然后按顺序遍历后面n-m个结点,总共需要遍历n-m+1个结点。最后要判断m是否从1开始,从1开始要修改head指针,不从1开始则将第m-1个结点的next指针指向修改好的那段链表的起始结点,最后该段链表的最后一个结点指向原第n+1个结点。
时间复杂度: O(n)
空间复杂度: O(1)

题目

Reverse Linked List II

个人解答

class Solution {
public:
    ListNode* reverseBetween(ListNode* head, int m, int n) {
    	int pos = m;
    	if (head == nullptr) return nullptr;
        else if (m == n) return head;
    	ListNode *preNode = nullptr, *curNode = head, *nextNode = head->next;
        while (m > 1) {    // 调过前面的结点
        	preNode = curNode;
        	curNode = nextNode;
        	nextNode = nextNode ? nextNode->next : nextNode;
        	m--;
        }
        ListNode* lastNode1 = preNode, *lastNode2 = curNode;
        while (pos <= n) {  // 修改区间内的结点next指针域
        	curNode->next = preNode;
        	preNode = curNode;
        	curNode = nextNode;
        	nextNode = nextNode ? nextNode->next : nextNode;
        	pos++;
        }
        if (lastNode1) lastNode1->next = preNode; // m>1
        else head = preNode;        // m=1
        lastNode2->next = curNode;
        return head;
    }
};

题目地址

Reverse Linked List II

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值