关键知识
链表的处理
解答思路
题目要求将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)
题目
个人解答
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;
}
};