假设线性表(a1,a2,a3,...,an)采用带头结点的单链表存储,请设计算法函数void Reverse(LinkList head),将带头结点的单链表head倒置,使表变成(an,an-1,...,a3,a2,a1)。并构造测试用例进行测试
时间: 2024-09-23 07:13:19 浏览: 46
在带头结点的单链表中实现链表反转,我们可以利用迭代或递归的方式来完成。这里我将提供一个迭代版本的算法:
```c++
// 定义链表节点结构
typedef struct ListNode {
int data;
ListNode* next;
} ListNode;
// 函数Reverse()实现链表反转
void Reverse(ListNode* &head) {
ListNode* prev = nullptr; // 存储前一个节点
ListNode* curr = head; // 当前节点
while (curr != nullptr) { // 遍历整个链表
ListNode* nextTemp = curr->next; // 保存当前节点的下一个节点
curr->next = prev; // 更新当前节点的next指向prev
prev = curr; // 移动prev指向前一个节点
curr = nextTemp; // 移动curr到下一个节点
}
// 更新头节点为原链表的最后一个节点
if (prev != nullptr)
head = prev;
}
```
测试用例:
```c++
// 创建测试链表
ListNode* createTestList(int n) {
ListNode* list = new ListNode{1};
for (int i = 2; i <= n; ++i) {
list->next = new ListNode{i};
list = list->next;
}
return list;
}
// 测试函数
void testReverse() {
int n = 5;
ListNode* head = createTestList(n);
printf("Original List: ");
printList(head); // 打印原始链表
Reverse(head);
printf("\nReversed List: ");
printList(head); // 打印反转后的链表
deleteList(head); // 清理内存
}
// 辅助函数,用于打印链表
void printList(ListNode* head) {
while (head) {
printf("%d ", head->data);
head = head->next;
}
printf("\n");
}
// 辅助函数,释放链表内存
void deleteList(ListNode* head) {
ListNode* temp = head;
while (temp) {
ListNode* next = temp->next;
delete temp;
temp = next;
}
}
```
运行这个`testReverse`函数,你可以看到链表从`1,2,3,4,5`变为`5,4,3,2,1`。如果链表为空或者只有一个元素,反转后结果保持不变。
阅读全文