设计在单链表中删除值相同的多余结点的算法。c语言
时间: 2024-12-11 20:19:07 浏览: 20
在C语言中设计一个算法来删除单链表中所有值相同的多余节点,可以采用迭代的方式,同时维护两个指针,一个遍历链表,一个用于查找并替换当前元素。以下是基本步骤:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表结构体
typedef struct Node {
int data;
struct Node* next;
} Node;
// 创建新节点
Node* createNode(int data) {
Node* newNode = (Node*)malloc(sizeof(Node));
if (newNode != NULL) {
newNode->data = data;
newNode->next = NULL;
}
return newNode;
}
// 删除链表中值相同的节点
void removeDuplicates(Node** head) {
if (*head == NULL || (*head)->next == NULL) {
return; // 如果链表为空或者只有一个元素,无需处理
}
Node* current = *head;
Node* runner = current;
while (current->next != NULL) {
if (current->data == runner->data) {
Node* temp = current->next;
current->next = current->next->next;
free(temp); // 释放多余的节点
} else {
runner = runner->next;
current = current->next;
}
}
}
// 打印链表
void printList(Node* node) {
while (node != NULL) {
printf("%d ", node->data);
node = node->next;
}
printf("\n");
}
int main() {
// 初始化一个链表示例
Node* 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->next = createNode(4);
printf("Before removing duplicates:\n");
printList(list);
removeDuplicates(&list);
printf("After removing duplicates:\n");
printList(list);
return 0;
}
```
在这个例子中,`removeDuplicates` 函数遍历链表,如果遇到相同值的节点,就将它从链表中移除,并释放其内存。最后,`printList` 函数用于展示处理后的链表。
阅读全文