如何用C语言实现在单循环链表上实现删除所有重复的结点,已完成的代码如下:
// 单链表,定义结构体
#include
#include
typedef struct lian_biao{
int data;
struct lian_biao* p_data;
}L;
// 建立单循环链表
L* creat_list(){
L* head=(L*)malloc(sizeof(L));
L *rear=head,*p=NULL;
int input=0;
printf("依次输入,以0结束\n输入第1个元素的值:");
scanf("%d",&input);
while(0 != input){
p=(L*)malloc(sizeof(L));
p->data=input;
rear->p_data=p;
rear=p;
scanf("%d",&input);
}
rear->p_data=head;
return head;
}
求详细解答 谢谢
struct Node {
int val;
struct Node *next;
};
void remove_duplicate(struct Node *head) {
unordered_set<int> hash;
struct Node *curr = head, *prev = NULL;
while (curr != head || prev == NULL) {
if (hash.count(curr->val)) {
prev->next = curr->next;
free(curr);
} else {
hash.insert(curr->val);
prev = curr;
}
curr = prev->next;
}
}
首先,在单循环链表上删除重复结点需要用到两个指针:一个指向当前结点,另一个指向当前结点之前的结点。
具体实现步骤如下:
1.首先定义两个指针,分别指向当前结点和当前结点之前的结点。
2.从链表的第二个结点开始遍历,对于每一个结点,将当前结点的值与之前结点的值进行比较。
3.如果当前结点的值与之前结点的值相同,则说明这是一个重复结点,需要删除。将之前结点指向当前结点的下一个结点,并释放当前结点的内存。
4.如果当前结点的值与之前结点的值不同,则说明这是一个新结点,将之前结点指向当前结点。
5.更新当前结点为下一个结点,继续遍历链表。
下面是用C语言实现的代码:
void delete_duplicate(L* head) {
L* cur = head->p_data;
L* pre = head;
while (cur != head) {
L* p = head;
while (p != pre) {
if (p->data == cur->data) {
pre->p_data = cur->p_data;
free(cur);
cur = pre->p_data;
break;
}
p = p->p_data;
}
if (p == pre) {
pre = cur;
cur = cur->p_data;
}
}
}
在上面的代码中,我们使用了两个指针: cur和pre。cur指向当前结点,pre指向当前结点之前的结点。我们遍历整个链表,对于每一个结点,都将其与之前的结点进行比较。如果当前结点与之前的结点相同,则删除该结点,并将之前结点指向当前结点的下一个结点。如果当前结点与之前的结点不同,则将之前结点指向当前结点。
请注意,这个代码是在单循环链表上实现的,如果您在双向链表上实现,可能需要额外的步骤来处理双向链表上的指针。