- 单向链表的去重:
- 所谓的去重,就是
去除单向链表中重复的数据结点
,代码如下:
- 示例代码:
int del_rep_link_list(node_t *phead){
if(NULL == phead){
printf("入参为NULL,请检查..\n");
return -1;
}
if(NULL == phead->next){
printf("只有一个头结点\n");
return -1;
}
if(NULL == phead->next->next){
printf("只有一个数据结点\n");
return -1;
}
node_t *p = phead->next;
node_t *q = NULL;
node_t *k = NULL;
while(NULL != p){
k = p;
q = p->next;
while(NULL != q){
if(p->data != q->data){
k = k->next;
q = q->next;
} else {
//删除结点q
k->next = q->next;
free(q);
//q = NULL;
//也可直接让q后面的那个结点的地址覆盖q的地址
q = k->next;
}
}
p = p->next;
}
return 0;
}
- 操作步骤:
- 1.定义一个指针p,将
头结点的指针域指向p
,此时的p
就是第0个结点的地址
;
- 2.定义一个指针q,用于保存p后面的结点地址,即循环中的
q = p->next
;
- 3.定义一个指针k,
始终用来保存q前面的那个结点的地址
,也可以备份指针p
,即 k = p
;
- 4.结点p指针域指向q;
- 5.内层
while循环
,比较p和q的数据域
,若不等
,就向后移动指针k和q
,若相等
,就删除q指向的结点
,直到q=NULL
;
- 6.外层
while循环
,遍历整个单向链表,直到p=NULL;