设L为带头结点的有序单链表,试编写一个算法删除L中的重复元素。例如: L=(1,1,2,4,4,9,9,9),执行算法后 L=(1,2,4,9)请先定义单链表存储结构。要求:不要另开辟数据存储空间,定
时间: 2024-11-27 22:02:54 浏览: 2
在链表中删除重复元素,可以采用迭代的方式,遍历链表的同时检查当前节点的值是否等于下一个节点的值。如果相等,则跳过这个节点;如果不相等,则将它添加到结果链表中。以下是算法的基本步骤:
1. 定义链表节点结构,通常包含一个数据域 `data` 和一个指向下一个节点的指针 `next`:
```c++
typedef struct ListNode {
int data;
ListNode* next;
} ListNode;
```
2. 初始化两个指针 `current` 和 `previous` 分别指向链表的第一个节点和空(表示无前驱):
```c++
ListNode* current = head;
ListNode* previous = nullptr;
```
3. 遍历链表,直到 `current` 指针为空:
```c++
while (current != nullptr) {
ListNode* nextTemp = current->next; // 临时保存当前节点的下一个节点
if (current->data == nextTemp->data) { // 如果当前节点和下一个节点的值相等
// 删除当前节点
if (previous == nullptr) { // 如果是头节点
head = nextTemp;
} else {
previous->next = nextTemp;
}
free(current); // 释放当前节点内存
} else {
previous = current; // 移动 previous 指向 current
}
current = nextTemp; // 移动 current 到下一个节点
}
```
4. 最后返回新的链表头 `head`。
注意:在 C++ 中使用智能指针(如 std::unique_ptr 或 shared_ptr)替代 raw pointers 可以避免手动管理内存的问题。
阅读全文