- 单向链表的翻转:
- 将
第0个数据结点
后面的所有数据结点
,依次头插
到头结点和第0个数据结点之间
即可,代码如下:
- 示例代码:
int filp_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 = p->next;
node_t *ptemp = NULL;
p->next = NULL;
while(NULL != q){
ptemp = q->next;
q->next = phead->next;
phead->next = q;
q = ptemp;
}
return 0;
}
- 操作步骤:
- 1.定义
第0个数据结点指针
,并将头结点的指针域指向第0个结点
的指针,即node_t *p = phead->next
;
- 2.定义
第1个数据结点指针
,并把第0个数据结点的指针域指向第1个数据节点的指针
,即node_t *q = p->next
;
- 3.定义一个指针,用来
保存指针q的指针域
,即ptemp = q->next
,以便于循环遍历单向链表的所有数据结点
,即每次循环结束前,令q = ptemp,就可以继续向后遍历其他的数据结点
;
- 4.采用
头插法
的形式,并利用while循环
,将第1个数据结点
及其以后的所有
数据结点依次头插到头结点和第0个数据结点之间
,直到指针q为NULL
,即原单向链表
的第0个结点的指针域为NULL
,就完成了单向链表的所有数据结点的翻转
;
- 单向链表的排序:
- 可以使用
冒泡排序
,即可完成单向链表所有数据结点的排序
,代码如下:
- 示例代码:
nt sort_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;
int temp = 0;
while(NULL != p->next){
q = p->next;
while(NULL != q){
if(p->data > q->data){
temp = p->data;
p->data = q->data;
q->data = temp;
}
q = q->next;
}
p = p->next;
}
return 0;
}
- 操作步骤:
- 1.定义指针p,让
头结点的指针域指向p
,即 node_t *p = phead->next
;
- 2.定义指针q,让
其他的结点指针域指向q
,用于循环中,即 q = p->next
;
- 3.
第一层循环
结束的条件是NULL != p->next
;
- 4.
第二层循环
结束的条件是NULL != q
;
- 5.
比较指针p和指针q的数据域
,不符合
if条件语句内条件,就交换
,然后指针p不动,向后移动指针q
,符合
if条件语句内条件,指针p不动,向后移动指针q,直到指针q为NULL
,最后最大值
就是指针p指向的结点数据域
,即p->data
;