获取并处理链表的重复项是一种数据结构的基本操作,C语言数据结构中,我们可以使用链表来实现该操作。下面是一个实现链表去重的示例:
实现思路
- 从链表的头结点开始遍历链表;
- 对于每个节点,分别访问其后面的节点,找到与其值相同的节点并删除;
- 继续遍历链表,直到所有的重复节点均被删除。
代码实现
下面是一个完整的C语言代码示例实现链表去重:
#include<stdio.h>
#include<stdlib.h>
struct node {
int data;
struct node *next;
};
void removeDuplicates(struct node *head) {
struct node *temp1, *temp2, *dup;
temp1 = head;
while (temp1 != NULL && temp1->next != NULL) {
temp2 = temp1;
while (temp2->next != NULL) {
if (temp1->data == temp2->next->data) {
dup = temp2->next;
temp2->next = temp2->next->next;
free(dup);
} else {
temp2 = temp2->next;
}
}
temp1 = temp1->next;
}
}
void printList(struct node *head) {
struct node *temp = head;
while (temp != NULL) {
printf("%d->", temp->data);
temp = temp->next;
}
printf("NULL\n");
}
void push(struct node **head_ref, int new_data) {
struct node *new_node = (struct node*) malloc(sizeof(struct node));
new_node->data = new_data;
new_node->next = (*head_ref);
(*head_ref) = new_node;
}
int main() {
struct node *head = NULL;
push(&head, 10);
push(&head, 12);
push(&head, 11);
push(&head, 12);
push(&head, 11);
push(&head, 11);
push(&head, 10);
printf("Linked list before removing duplicates:\n");
printList(head);
removeDuplicates(head);
printf("\nLinked list after removing duplicates:\n");
printList(head);
return 0;
}
为了演示代码的正确性,我们构建了一个包含多个重复项的链表,并将该链表作为参数传递给removeDuplicates()
函数。执行该函数后,我们可以看到所有的重复项已被删除,输出的结果为:
Linked list before removing duplicates:
10->12->11->12->11->11->10->NULL
Linked list after removing duplicates:
10->12->11->NULL
示例说明
示例一
请注意代码中的removeDuplicates()
函数,这是实现去重操作的核心功能。代码使用两个指针temp1
和temp2
在链表中遍历所有的节点。对于每个节点,内部的while
循环检查是否存在与该节点相同的其他节点。如果找到了重复项,则将temp2
指针移到下一个节点,并通过free
函数释放重复的节点。如果没有找到重复项,则将temp2
指针移到下一个节点继续循环。
示例二
在完整代码的main
函数中,我们先构建了一个具有重复项的链表,该链表的顺序为10 -> 12 -> 11 -> 12 -> 11 -> 11 -> 10。我们将该链表传递给removeDuplicates()
函数,并调用printList()
函数打印输出结果。在输出结果中,我们可以看到所有重复项(10、12和11)均已被成功删除,链表的新顺序为10 -> 12 -> 11。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言数据结构实现链表去重的实例 - Python技术站