- 双向链表的翻转:
- 与
单向链表翻转
的思路一致
,都是 将第0个数据结点
后面的所有数据结点
,依次头插
到头结点和第0个数据结点之间
即可,代码如下: - 示例代码:
int filp_dplink_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;
q->front = phead;
phead->next->front = q;
phead->next = q;
q = ptemp;
}
return 0;
}
- 注意事项:
- 1.定义一个指针,用来
保存指针q的指针域
,即ptemp = q->next
,以便于循环遍历双向链表的所有数据结点
,即每次循环结束前,令q = ptemp,就可以继续向后遍历其他的数据结点
; - 2.采用
头插法
的形式,并利用while循环
,将第1个数据结点
及其以后的所有
数据结点依次头插到头结点和第0个数据结点之间
,直到指针q为NULL
,即原双向链表
的第0个结点的指针域为NULL
,就完成了双向链表的所有数据结点的翻转
;