面试题—链表操作2
来源:互联网 发布:懒人做饭知乎 编辑:程序博客网 时间:2024/06/04 19:01
本篇博客主要介绍链表的操作,较上次的链表题难,更能够锻炼C语言的编程能力,对以后的面试有很大的帮助。内容主要包括单链表实现约瑟夫环,链表的排序,合并两个有序链表,判断链表是否带环并且计算环的长度等问题。
建立链表节点:
typedef int Datatype;typedef struct SListNode{ Datatype Data; SListNode *next;}SListNode;
——下面主要具体的程序实现(注释对代码的理解)
//链表的基本操作2//单链表实现约瑟夫环SListNode * JoseCycle(SListNode * pHead, int k){ if (pHead == NULL) //先进行链表判空操作 { return NULL; } SListNode *cur = pHead; while (1) { if (cur->next == cur) { return cur; } int count = k-1; //执行k-1次 while (count--) { cur = cur->next; } //替换法进行删除 SListNode *next = cur->next; cur->Data = next->Data; cur->next = next->next; free(next); }}//单链表的冒泡排序void BubbleSort(SListNode *pHead){ if (pHead == NULL || pHead->next == NULL) { return ; } SListNode *tail = pHead; while (tail) //使用两次循环进行冒泡控制 { SListNode *cur = pHead; SListNode *next = pHead->next; while (next) { if (cur->Data > next->Data) { Datatype tmp = cur->Data; cur->Data = next->Data; next->Data = tmp; cur = cur->next; next = next->next; } tail = tail->next; } }}//合并两个有序单链表,使得链表仍有序SListNode *MergeList(SListNode * L1, SListNode *L2){ if (L1 == NULL) //先考虑L1和L2为空的情况,进行处理 { return L2; } if (L2 == NULL) { return L1; } SListNode * newHead; //创建新的链表 SListNode *pHead1 = L1; SListNode *pHead2 = L2; if (pHead1->Data < pHead2->Data) //确定新链表的头节点 { newHead = pHead1; pHead1 = pHead1->next; } else { newHead = pHead2; pHead2 = pHead2->next; } SListNode *tail = NULL; while (pHead1 && pHead2) //将两个指针指向的内容相比较,摘掉较小的连接到新的链表中 { if (pHead1->Data < pHead2->Data) { tail->next = pHead1; } else { tail->next = pHead2; pHead2 = pHead2->next; } tail = tail->next; } if (pHead1) //将另一个有剩余节点的链表,直接连接到新的链表上 { tail->next = pHead1; } else if (pHead2) { tail->next = pHead2; } return newHead;}//释放节点void DestoryList(SListNode *pHead){ SListNode *cur = pHead; while (cur) { SListNode *tmp = cur; cur = cur->next; free(tmp); } pHead = NULL;}//判断链表是否带环?求环的长度?SListNode *checkCycle(SListNode *pHead){ SListNode *slow = pHead; //利用快慢指针的方式 SListNode *fast = pHead; while (fast && fast->next) { slow = slow->next; fast = fast->next->next; if (fast == slow) //若快指针和慢指针相遇,则链表中带环 { return fast; } } return NULL;}//求环的长度int GetCycleLength(SListNode *ptr){ assert(ptr); //先对指针进行判空 SListNode *cur = ptr; int count = 0; do { ++count; cur = cur->next; } while (cur != ptr); //利用计数器的方式进行计数 return count;}
本文出自 “无心的执着” 博客,谢绝转载!
0 0
- 面试题—链表操作2
- 面试题—链表操作
- 链表操作面试题
- 链表操作面试题
- 链表操作 算法面试题
- 雅虎面试题之链表操作
- 链表常用操作及面试题
- 常见面试题之链表操作
- 链表基本操作及面试题
- (程序员面试题)链表的基本操作
- 面试题5: 链表的相关操作
- LeetCode链表操作常见面试题汇总
- Java面试题链表、树和位操作
- 字符串操作——面试题总结
- 字符串操作——面试题总结
- 【面试题】单链表的操作2
- 面试题-位操作
- 面试题:位操作
- 类和对象—复数类
- 面试题—链表操作
- C语言编写—通讯录(小项目)
- 浅谈为什么Java接口中不允许定义变量------转帖
- android混淆后webview显示问题
- 面试题—链表操作2
- 顺序表(C++实现)
- string类(c++)
- POJ2251-Dungeon Master
- 单链表(c++实现)
- 双向链表(c++实现)
- 单继承、多继承--问题解析
- 注释转换——(小项目)
- 模板(顺序表与栈)