链表内指定区间反转_牛客题霸_牛客网 (nowcoder.com)

/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
class Solution {
public:
/**
*
* @param head ListNode类
* @param m int整型
* @param n int整型
* @return ListNode类
*/
ListNode* reverseBetween(ListNode* head, int m, int n) {
// write code here
//新建头节点
ListNode* newHead = new ListNode(-1);
//连接
newHead->next = head;
//经典双指针
ListNode* pre = newHead;
ListNode* cur = head;
//遍历找到开始反转点
for(int i = 1; i < m; i++){
pre = cur;
cur = cur->next;
}
//翻转操作
for(int i = m; i < n; i++){
ListNode* temp = cur->next;
cur->next = temp->next;
temp->next = pre->next;
pre->next = temp;
}
//返回结果
return newHead->next;
}
};
- 时间复杂度:O(n),最坏情况下需要遍历全部链表节点,比如�m为链表最后一个位置,或者�n为链表最后一个位置时
- 空间复杂度:O(1),常数级指针变量,无额外辅助空间使用
该代码实现了一个函数,用于在链表中反转指定区间的节点。首先创建一个虚拟头节点方便操作,然后通过双指针遍历找到反转起点,接着进行翻转操作,最后返回新链表的头节点。时间复杂度为O(n),空间复杂度为O(1)。
128

被折叠的 条评论
为什么被折叠?



