单链表面试题(2)
来源:互联网 发布:淘宝收藏大师怎么设置 编辑:程序博客网 时间:2024/05/17 03:13
//判断链表是否带环SListNode* IsCircle(SListNode* pHead)//该函数返回的是快慢指针的相遇节点{ if (pHead == NULL) { return NULL; } SListNode* fast = pHead; SListNode* slow = pHead; while (slow != fast) { fast = fast->next->next; slow = slow->next; } return fast;}//判断链表是否带环,若带环,求环长size_t GetCircleLen(SListNode* pHead, SListNode* MeetNode){ assert(pHead&&MeetNode); size_t count = 1; SListNode* cur = MeetNode; while (cur != MeetNode) { count += 1; cur = cur->next; } count += 1; return count;}//求带环链表的环入口SListNode* GetEntry(SListNode* pHead,SListNode* MeetNode){ assert(pHead&&MeetNode); SListNode* fast = MeetNode; SListNode* slow = pHead; while (fast) { if (fast == slow) { return fast; } fast = fast->next->next; slow = slow->next; } return NULL;}//判断两个链表(不带环)是否相交,若相交,求交点int IsMeet(SListNode* l1, SListNode* l2){ assert(l1&&l2); SListNode* cur1 = l1; SListNode* cur2 = l2; while (cur1) { cur1 = cur1->next; } while (cur2) { cur2 = cur2->next; } if (cur1 == cur2) { return 1; } else { return 0; }}//求交点SListNode* GetMeetNode(SListNode* l1, SListNode* l2){ assert(l1&&l2); //求两个链表的长度 SListNode* cur1 = l1; SListNode* cur2 = l2; int len1 = 1; int len2 = 1; while (cur1) { cur1 = cur1->next; len1++; } while (cur2) { cur2 = cur2->next; len2++; } //找出较长和较短的,计算长度之差赋值给K SListNode* longer = NULL; SListNode* shorter = NULL; if (len1 > len2) { longer = l1; shorter = l2; } else { longer = l2; shorter = l1; } int k = abs(len1 - len2); while (k) //长的先走k步 { longer = longer->next; } while (longer!=shorter) //长短链表相遇节点即就是交点 { longer = longer->next; shorter = shorter->next; } return longer;}//复杂链表的复制typedef struct ComplexNode //结构定义{ int Value; ComplexNode* Next; ComplexNode* Sibling;}ComplexNode;//在每个节点的后面连接一个它自己,形成一个新的链表void CopySList(ComplexNode* pHead){ assert(pHead); ComplexNode* cur = pHead; while (cur) { ComplexNode* s = (ComplexNode*)malloc(sizeof(ComplexNode)); s->Value = cur->Value; s->Sibling = NULL; cur->Next = s; cur = cur->Next; s->Next = cur; }}//修改随机指针的值,使其指向原始值得下一个节点void UpdateSibling(ComplexNode* pHead){ assert(pHead); ComplexNode* cur = pHead; while (cur) { cur = cur->Next; cur->Next->Sibling = cur->Sibling->Next; }}//按奇数个和偶数个拆分链表ComplexNode* BreakComplexNode(ComplexNode*pHead){ ComplexNode* pNode = pHead; ComplexNode* pClonedHead = NULL; ComplexNode* pClonedNode = NULL; if (pNode != NULL) { pClonedNode = pNode->Next; pNode->Next = pClonedNode->Next; pNode = pNode->Next; } while (pNode != NULL) { pClonedNode->Next = pNode->Next; //把偶数位置的结点链接起来就是复制出来的新链表 pClonedNode = pClonedNode->Next; pNode->Next = pClonedNode->Next; //把奇数位置的结点链接起来就是原始链表 pNode = pNode->Next; } return pClonedHead;}
0 0
- 单链表面试题(2)
- 单链表面试题
- 单链表面试题
- 单链表面试题
- 单链表面试题
- 单链表面试题
- C语言常见单链表面试题(2)
- C语言单链表面试题2
- 单链表面试题汇总(1)
- 单链表面试题(一)
- 单链表面试题(综合)
- 【C】单链表面试题(进阶)
- 单链表面试题(一)
- 单链表面试题总结
- 单链表面试题集合
- 单链表面试题汇总
- 单链表面试题汇总
- 【C++】单链表面试题
- Leetcode OJ Contest23 Minimum Time Difference_Leetcode539
- 浅克隆与深克隆
- Android中关于bean类的总结
- 《ACM程序设计》书中题目 K-11 build a wall
- 九度 oj 题目1548:平面上的点
- 单链表面试题(2)
- Qt C++发送图片到QML显示
- Python 包管理工具
- PE格式详解讲解1
- Ubuntu升级系统
- python读取中文路径
- Ubuntu 12.04安装带调试功能的Bochs 2.6.2, 调试linux 0.11 内核
- 输出全排列 (next_permutation)
- 让你的app无法使用系统截图的探究