使用c设计在单链表中删除值相同的多余结点的算法。
时间: 2024-12-06 22:25:41 浏览: 11
在C语言中,我们可以设计一个算法来从单链表中删除所有值相同的重复结点。这里我们可以使用两个指针,一个用于当前节点,另一个用于前一个节点。当遇到值相等的节点时,我们会跳过它。以下是详细的步骤:
```c
#include <stdbool.h> // 添加布尔类型支持
typedef struct ListNode {
int data;
struct ListNode* next;
} ListNode;
// 删除链表中的重复节点
void removeDuplicates(ListNode** head) {
if (*head == NULL || (*head)->next == NULL) {
return; // 空链表或只有一个节点,无需操作
}
ListNode* current = *head;
ListNode* prev = NULL;
while (current != NULL) {
ListNode* nextTemp = current->next;
if (current->data == nextTemp->data) {
// 找到重复的节点,移除当前节点
if (prev == NULL) {
*head = nextTemp; // 如果前一个节点为空,更新头节点
} else {
prev->next = nextTemp; // 否则,前一个节点的next指向下一个非重复节点
}
free(current); // 释放当前节点的内存
current = nextTemp; // 将current移动到下一个可能的重复节点
} else {
prev = current; // 当前节点不是重复,将prev向前移动
current = nextTemp;
}
}
}
// 示例链表测试
void printList(ListNode* head) {
ListNode* temp = head;
while (temp != NULL) {
printf("%d -> ", temp->data);
temp = temp->next;
}
printf("NULL\n");
}
int main() {
// 创建链表示例
ListNode* list = createNode(1);
list->next = createNode(2);
list->next->next = createNode(2);
list->next->next->next = createNode(3);
list->next->next->next->next = createNode(4);
list->next->next->next->next = createNode(4);
printf("原始链表: ");
printList(list);
removeDuplicates(&list);
printf("去重后的链表: ");
printList(list);
return 0;
}
// 功能函数需要你自己实现
ListNode* createNode(int value) {
// 创建新节点并设置值和next指针
// 返回新节点的地址
}
```
这个算法会在链表中找到所有的重复值并删除它们,保持链表的顺序不变。
阅读全文