📅  最后修改于: 2023-12-03 15:40:53.182000             🧑  作者: Mango
在排序链表中,经常需要去除重复的元素。下面是一个用于从排序链表中删除重复项的 C 程序:
// 用于从排序链表中删除重复项的 C 程序
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
// 创建链表
ListNode* createList(int arr[], int n) {
if (n == 0) {
return NULL;
}
ListNode *head = (ListNode*)malloc(sizeof(ListNode));
head->val = arr[0];
head->next = NULL;
ListNode *cur = head;
for (int i = 1; i < n; i++) {
ListNode *node = (ListNode*)malloc(sizeof(ListNode));
node->val = arr[i];
node->next = NULL;
cur->next = node;
cur = cur->next;
}
return head;
}
// 打印链表
void printList(ListNode *head) {
ListNode *cur = head;
while (cur) {
printf("%d ", cur->val);
cur = cur->next;
}
printf("\n");
}
// 从排序链表中删除重复项
ListNode* deleteDuplicates(ListNode *head) {
if (head == NULL) {
return NULL;
}
ListNode *cur = head;
while (cur->next != NULL) {
if (cur->val == cur->next->val) {
ListNode *temp = cur->next;
cur->next = temp->next;
free(temp);
} else {
cur = cur->next;
}
}
return head;
}
int main() {
int arr[] = {1, 2, 2, 3, 4, 4};
int n = sizeof(arr) / sizeof(int);
ListNode *head = createList(arr, n);
printf("链表:");
printList(head);
head = deleteDuplicates(head);
printf("去重后的链表:");
printList(head);
return 0;
}
这个程序实现了从排序链表中删除重复项的功能。程序中主要包括以下几个部分:
typedef
定义链表节点结构体 ListNode
,包括一个整数 val
和一个指向下一个节点的指针 next
。createList
函数,通过传入一个数组和数组长度来创建一个排序链表,并返回链表头指针。printList
函数,用于打印排序链表的每个元素。deleteDuplicates
函数,用于从排序链表中删除重复项。该函数使用双指针法,使用一个指针 cur
遍历链表,一个指针 temp
指向当前节点的下一个节点。通过比较 cur->val
和 temp->val
是否相等来判断当前节点是否为重复项。如果是重复项,则释放重复节点的内存并修改指针;否则,继续遍历链表。main
函数,创建一个排序链表并打印。然后调用 deleteDuplicates
函数去重,并再次打印链表。链表:1 2 2 3 4 4
去重后的链表:1 2 3 4
这个程序通过使用链表节点和双指针算法,实现了从排序链表中删除重复项的功能。程序中还包括了创建链表和打印链表的功能,方便程序员调试和验证程序的正确性。