C语言实现单链表面试题——基础篇(中)
来源:互联网 发布:男性发型设计软件 编辑:程序博客网 时间:2024/05/16 17:51
6.逆值/翻转单链表
思想同从头打印链表一样,但应注意在反向连接链表时的指向问题
void ListTranspose(ListNode **ppList,ListNode *pList)//转置单链表 { assert(ppList); if((*ppList == NULL)||((*ppList)->next == NULL)) return; //当链表没有节点和只有一个节点的时候,转置不改变 if(pList->next != NULL) // ListTranspose(ppList,pList->next); else { *ppList = pList;//找到最后一个节点,并用头节点指向 return; } (pList->next)->next = pList; // pList->next = NULL; }
7. 单链表排序(冒泡排序)
冒泡排序是两两比较,N个数,需要N-1趟,每一趟可以找出最大的数放在这一趟的最右边:
void ListBubb(ListNode **ppList)//冒泡排序{ assert(ppList); if(*ppList == NULL)//链表为空时,直接返回 return; ListNode *head = *ppList;//每次一趟从头节点开始 ListNode *tail = NULL; //用于结束标志,每一趟后tail向前一个节点挪 while((*ppList)->next != tail) { head = *ppList; while(head->next != tail) { if((head->data) > (head->next->data)) { DataType tmp = head->data; head->data = head->next->data; head->next->data = tmp; } head = head->next; } tail = head; }}
8.合并两个有序链表,合并后依然有序
最简单的方法就是用第一个链表的尾部连上另一个链表头节点,再用冒泡排序:
ListNode* ListLink(ListNode **ppList_1,ListNode **ppList_2){ assert(ppList_1&&ppList_2); ListNode *tail = *ppList_1; while(tail->next != NULL) { tail = tail->next; } tail->next = *ppList_2; ListBubb(ppList_1); return *ppList_1;}
但这种方法时间复杂太大,有没有更好的办法呢?
先找两个链表第一个节点的小的头链表,然后在这链表后面插两两比较小的节点。直至其中一个链表遇到NULL;
//链接链表并排序ListNode* ListLink(ListNode **ppList_1,ListNode **ppList_2){ assert(ppList_1&&ppList_2); ListNode *pList_1 = *ppList_1; ListNode *pList_2 = *ppList_2; if(pList_1->data > pList_2->data)//找到头节点小的链表 { *ppList_1 = *ppList_2; pList_2 = pList_2->next; } else { pList_1 = pList_1->next; } ListNode *pList = *ppList_1; while(pList_1 && pList_2) { if(pList_1->data > pList_2->data) { pList->next = pList_2; pList_2 = pList_2->next; } else { pList->next = pList_1; pList_1 = pList_1->next; } pList = pList->next; } if(pList_1)//遇到NULL { pList = pList_2; } else { pList = pList_1; } return *ppList_1;}
阅读全文
1 0
- C语言实现单链表面试题——基础篇(中)
- C语言实现单链表面试题(基础篇)
- C语言实现单链表面试题(基础篇)
- c语言实现单链表面试题(基础篇)
- C语言实现单链表面试题——基础篇(上)
- C语言实现单链表面试题——基础篇(下)
- C语言实现单链表面试题--基础篇
- C语言实现单链表面试题--基础篇
- C语言实现单链表面试题--基础篇
- c语言实现单链表面试题--基础篇
- C语言实现单链表面试题_基础篇
- C语言实现单链表面试题---基础篇
- C语言实现单链表面试题 ----基础篇
- c语言实现单链表面试题——进阶
- C语言实现单链表面试题(进阶篇)
- c语言实现单链表面试题
- c语言实现单链表面试题之进阶篇
- C语言实现单链表面试题-------进阶篇
- FFmpeg命令推流地址
- gii生成代码
- 复杂SQL
- 文章标题
- 使用_Python_和_Asyncio_编写在线多人游戏(一)
- C语言实现单链表面试题——基础篇(中)
- 2017年六月九日 NO.9 HTML(八)——嵌入块部分内容(笔记)
- Java Serializable(序列化)的理解和总结
- 初创公司如何快速低耗实现数据化运营
- mybatis自动生成相关文件
- $*和$@区别
- 用Redis实现Session功能
- 通过model->rowCount();只能返回最多256个数据的长度的问题解决
- 使用opencv以及pcl将2D图像转换为3D点云