2、用单链表存储结构实现线性表的就地逆置算法,即(a1,a2,…,an)(an,an-1,…,a2,a1) 3.已知带头结点的单链表L,试设计一个算法,用于删除单链表L中值重复的结点,并释放被删结点空间
时间: 2024-09-19 19:03:54 浏览: 56
2. **就地逆置单链表的算法**:
```c++
void reverse_in_place(LinkListNode* &head){
if(head == nullptr || head->next == nullptr){ // 链表为空或只有一个节点的情况,无需反转
return;
}
LinkListNode* prev = nullptr; // 上一个节点
LinkListNode* curr = head; // 当前节点
while(curr != nullptr){
LinkListNode* next_temp = curr->next; // 保存当前节点的下一个节点
curr->next = prev; // 将当前节点指向prev,逆序链接
prev = curr; // 更新prev指向curr
curr = next_temp; // 移动curr到下一个节点
}
head = prev; // 重置头节点,使其指向反转后的第一个节点
}
```
这个算法不需要额外的空间,它通过改变节点间的链接,实现了原地逆置。
3. **删除单链表中值重复的节点并释放空间的算法**:
```c++
void remove_duplicates(LinkListNode* &head){
if(head == nullptr || head->next == nullptr){ // 链表为空或只有一个节点,无重复情况
return;
}
LinkListNode* current = head;
LinkListNode* runner = head->next;
while(runner != nullptr){
if(current->data == runner->data){ // 发现重复节点
LinkListNode* to_remove = runner; // 保存要删除的节点
while(to_remove->next != nullptr && to_remove->next->data == current->data){
to_remove = to_remove->next; // 跳过剩余重复节点
}
if(to_remove->next != nullptr){
// 更新当前节点的指向,跳过重复部分
current->next = to_remove->next;
} else { // 若当前节点本身就是最后一个重复节点,则直接删除
if(current == runner){
head = current->next;
}
delete to_remove;
}
} else {
current = runner; // 没有重复,继续遍历
}
runner = runner->next; // 移动runner到下一个节点
}
}
```
这个算法会遍历整个链表,遇到重复值时跳过多余的节点,并在遍历结束时删除最后一个重复节点,同时释放其占用的内存空间。
阅读全文