1、实现单链表的就地逆置。 2、建立两个非递减有序单链表,然后合并成一个非递减链表。 3、建立两个非递减有序单链表,然后合并成一个非递增链表。 4、编写一个C语言主函数,调试上述算法。
时间: 2025-06-14 18:18:23 浏览: 15
1. **就地逆置单链表**:
实现单链表的就地逆置,即在原链表的基础上翻转节点顺序,不需要额外的空间。可以使用三个指针`prev`, `current`, 和 `next`来辅助操作。首先设置`prev`为`NULL`,然后遍历链表,对于每个节点,将`current.next`指向`prev`,接着更新`prev`为当前节点,`current`向前移动一步,直到`current`变为`NULL`。
```c
void reverseList(ListNode* head) {
ListNode* prev = NULL;
ListNode* current = head;
while (current != NULL) {
ListNode* nextTemp = current->next;
current->next = prev;
prev = current;
current = nextTemp;
}
head = prev; // 更新头节点
}
```
2. **合并两个非递减有序链表** (合并为非递增链表):
遍历两个链表,每次选择较小的那个节点添加到新链表中,直到其中一个链表结束。然后将另一个链表剩余部分依次添加。
```c
ListNode* mergeSortedLists(ListNode* l1, ListNode* l2) {
ListNode* dummy = new ListNode(0);
ListNode* tail = dummy;
while (l1 && l2) {
if (l1->val <= l2->val) {
tail->next = l1;
l1 = l1->next;
} else {
tail->next = l2;
l2 = l2->next;
}
tail = tail->next;
}
if (l1)
tail->next = l1;
else if (l2)
tail->next = l2;
return dummy->next;
}
```
3. **合并两个非递减有序链表** (合并为非递减链表):
同样遍历两个链表,但这次比较值并同时更新两个链表,使得结果保持非递减。
```c
ListNode* mergeNonDecreasingLists(ListNode* l1, ListNode* l2) {
ListNode* dummy = new ListNode(0);
ListNode* tail = dummy;
while (l1 && l2) {
if (l1->val >= l2->val) {
tail->next = l1;
l1 = l1->next;
} else {
tail->next = l2;
l2 = l2->next;
}
tail = tail->next;
}
tail->next = (l1 ? l1 : l2); // 将剩余的部分连接
return dummy->next;
}
```
4. **主函数示例** (假设有一个`main()`函数并已包含链表结构定义):
```c
int main() {
ListNode* list1 = ...; // 初始化第一个链表
ListNode* list2 = ...; // 初始化第二个链表
// 反转链表
reverseList(list1);
// 合并为非递增或非递减链表
ListNode* merged1 = mergeNonDecreasingLists(list1, list2);
ListNode* merged2 = mergeSortedLists(list1, list2);
// 打印结果
printList(merged1); // 输出非递增链表
printList(merged2); // 输出非递减链表
return 0;
}
```
请注意,这里的代码片段省略了链表节点定义和输入链表初始化的部分,实际使用时需要自行补充。同时,`printList()`函数用于打印链表内容,也是未给出的一个辅助函数。
阅读全文
相关推荐

















