C语言单循环链表上实现删除所有重复的结点

如何用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;
}

求详细解答 谢谢

  1. 创建一个空的哈希表,用于存储单循环链表中已经出现过的结点值。
  2. 从链表的头结点开始遍历链表。
  3. 如果当前结点的值已经在哈希表中出现过,则删除当前结点。
  4. 如果当前结点的值没有在哈希表中出现过,则将当前结点的值插入到哈希表中。
  5. 继续遍历下一个结点,直到遍历完整个链表。
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指向当前结点之前的结点。我们遍历整个链表,对于每一个结点,都将其与之前的结点进行比较。如果当前结点与之前的结点相同,则删除该结点,并将之前结点指向当前结点的下一个结点。如果当前结点与之前的结点不同,则将之前结点指向当前结点。

请注意,这个代码是在单循环链表上实现的,如果您在双向链表上实现,可能需要额外的步骤来处理双向链表上的指针。