用C语言设计算法,将一个非空单链表中序号从 i 到 j 的结点逆置。
时间: 2023-06-01 15:02:43 浏览: 117
以下是一个可能的解法:
```
// 定义单链表结点
struct ListNode {
int val;
struct ListNode *next;
};
// 将链表中序号从i到j的结点逆置
struct ListNode* reverseBetween(struct ListNode* head, int i, int j) {
if (i == j) {
return head; // i和j相等,不需要逆置
}
struct ListNode *dummy = (struct ListNode *)malloc(sizeof(struct ListNode)); // 创建虚拟头结点
dummy->next = head;
struct ListNode *prev = dummy; // 记录逆置区间前一个结点
for (int k = 1; k < i; k++) {
prev = prev->next;
}
struct ListNode *cur = prev->next; // 记录逆置区间第一个结点
for (int k = i; k < j; k++) { // 逆置区间内的结点
struct ListNode *next = cur->next;
cur->next = next->next;
next->next = prev->next;
prev->next = next;
}
struct ListNode *newHead = dummy->next;
free(dummy);
return newHead;
}
```
算法的时间复杂度为 $O(j)$,空间复杂度为 $O(1)$。
阅读全文