有一个非空整数单链表L,设计一个算法删除值重复的节点,多个值相同的节点仅保留第一个。 测试时输入 8 1 4 1 2 2 1 3 4后输出1 4 2 3用c语言实现上述程序
时间: 2024-09-23 16:01:01 浏览: 40
基于链表的两个非递减有序序列的合并.docx
要实现这个功能,可以遵循以下步骤:
1. 定义一个指向链表结点的结构体和一个指针来指向当前结点(头结点)[^1]:
```c
// Define a node structure
typedef struct ListNode {
int val;
struct ListNode* next;
} ListNode;
```
2. 创建并初始化一个链表,这里采用CreateListTail方法来构建含有重复值的链表:
```c
ListNode* CreateListWithDuplicates(int* arr, size_t len) {
ListNode* head = NULL, *tail = NULL;
ListNode** current = &head;
// 使用尾插法定位新节点
for (int i = 0; i < len; ++i) {
if (!head || arr[i] > (*current)->val) {
*current = (ListNode*)malloc(sizeof(ListNode));
(*current)->val = arr[i];
(*current)->next = tail;
tail = *current++;
} else if (arr[i] == (*current)->val) {
// 如果值相同,则忽略之后的重复节点
}
}
return head;
}
```
3. 删除值重复的节点,仅保留第一个:
```c
void RemoveDuplicates(ListNode** node_ref) {
ListNode* current = *node_ref;
ListNode* prev = NULL;
while (current != NULL) {
ListNode* next_temp = current->next;
if (prev && current->val == prev->val) {
free(current); // 对已重复节点进行删除
prev->next = next_temp;
} else {
prev = current;
current = next_temp;
}
}
}
```
测试示例:
```c
int main(void) {
int input[] = {8, 1, 4, 1, 2, 2, 1, 3, 4};
size_t n = sizeof(input) / sizeof(input[0]);
ListNode* result_list = CreateListWithDuplicates(input, n);
RemoveDuplicates(&result_list);
// 希望输出的链表: 1->4->2->3
// 输出实际内容需根据你的链表操作逻辑实现
...
return 0;
}
```
注意,上面的代码没有包含打印链表的功能,你可能需要根据需求添加一个适当的辅助函数用于展示输出链表。输出的具体链表表示需要额外实现链表的访问和显示操作。
阅读全文