?整个链表以及去重操作:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>
typedef struct _con
{
int data;
struct _con* next;
}con;
//尾插法
con* createlist(int n)
{
con* head, * p, * tail;
head = tail = NULL;
int i = 0;
for (i = 0; i < n; i++)
{
p = (con*)malloc(sizeof(con));
p->next = NULL; // 添加这一行,初始化指针
scanf("%d", &p->data);
if (head == NULL)
{
head = tail = p;
}
else
{
tail->next = p;
tail = p;
}
}
return head;
}
void printList(con* head) {
while (head != NULL)
{
printf("%d -> ", head->data);
head = head->next;
}
printf("NULL\n");
}
con* single(con* head)
{
con* p = head->next;
con* q = head;//临时结点
int a[100] = { 0 };//链表内的数据是100以内的,如果需求不同,可自行更改;
//这里用一个判断数组,先假设所有数字都没出现过,赋初值为0;
if (head == NULL) {
return head; // 如果链表为空,则直接返回空指针
}
while (p)
{
if (a[p->data] == 0)
{
a[p->data] = 1;
q = p;
p = p->next;
}
else //就要去掉这个数据;去掉结点p;
{
q->next = p->next;
free(p);
p = q->next;
}
}
return head;
}
int main()
{
int n;
scanf("%d", &n);
con* head = NULL;
head = createlist(n);
head = single(head);
printList(head);
return 0;
}
?其中,最主要的去重部分我单拿出来:
con *single(con *head)
{
con* p = head->next;
con* q = head;//临时结点
int a[100] = { 0 };//链表内的数据是100以内的,如果需求不同,可自行更改;
//这里用一个判断数组,先假设所有数字都没出现过,赋初值为0;
if (head == NULL) {
return head; // 如果链表为空,则直接返回空指针
}
while (p)
{
if (a[p->data] == 0)
{
a[p->data]=1;
q = p;
p = p->next;
}
else //就要去掉这个数据;去掉结点p;
{
q->next = p->next;
free(p);
p=q->next;
}
}
return head;
}
这里怎么理解呢?最主要的就是else之后的去点部分:
我们首先有q,p这两个指针,而且q在p前面,也就是说,我们用p来遍历链表,一旦发现p的数据出现过了,我们就要去掉p这个结点,去点的操作就是:q->next=p->next;中间把p释放掉;最重要的就是:p=q->next;这里是让q这个指针继续发挥遍历的作用,指向被删除的结点的下一个结点;