反转单链表+合并有序单链表+查找单链表中倒数第k个节点--20150924
2015-09-25 23:23
633 查看
//题目1:反转一个单链表。(这是2015年广联达公司校招的第一题,15分,在华科的沁园12幢701考试的博主记忆犹新) //思路:需要3个辅助指针,一个指针指向当前要反转的节点, //一个指向该节点的前一个,一个指向该节点的后一个,三个指针同时移动。 //先把该节点的next指向前一个节点,然后把该节点赋值给前一个节点, //最后把下一个节点赋值给该节点,即完成一个节点的反转, //直到最后一个节点为止 struct ListLinkNode{ int value; ListLinkNode* pNext; } ListLinkNode* ReversedList(ListLinkNode* pHead){ ListNode* pReversedHead = NULL; ListNode* pNode = pHead; ListNode* pPrev = NULL; while(pNode!=NULL){ ListNode* pNext = pNode->next; //如果走到的链表的尾节点,则最后一个节点就是头节点 if(pNext==NULL){ pReversedHead = pNode; } pNode->next = pPrev; pPrev = pNode; pNode = pNext; } return pReversedHead; } //题目2:输入两个从小到大排序的有序链表,将其合并为一个链表后仍有序 //思路:用递归的方式,先比较两个链表的表头节点,将大的那个插入新链表的表尾,然后将该链表指针后移指向新的“表头”,然后递归。 ListLinkNode* Merge(ListLinkNode* pHead1 , ListLinkNode* pHead2){ //鲁棒性代码 if(pHead1==NULL){ rerutn pHead2; }else if(pHead2==NULL){ rerutn pHead1; } ListLinkNode* pMergeHead = NULL; if(pHead1->value > pHead2->value){ pMergeHead = pHead1; pMergeHead->next = Merge(pHead1->next,pHead2); }else{ pMergeHead = pHead2; pMergeHead->next = Merge(pHead1,pHead2->next); } return pMergeHead; } //题目3:查找单链表中倒数第k个节点 //思路:用两个指针A和B,A和B先都指向表头, //然后A先向后走k-1步,B不动,A走完后,A和B同时向后走,直到A走到表尾,此时B指向的节点就是倒数第k个节点。要注意鲁棒性。 ListLinkNode* FindkthToTail(ListLinkNode* pListHead, unsigned int k){ if(pListHead==NULL||k=0){ return NULL; } ListLinkNode* pANode = pListHead; ListLinkNode* pBNode = pListHead; //A走k-1步 for(int i = 0 ; i < k-1 ; i++){ if(pANode->next != NULL){ pANode = pANode->next; }else{ return NULL; } } while(pANode->next != NULL){ pANode = pANode->next; pBNode = pBNode->next; } return pBNode; }
相关文章推荐
- 关于指针的一些事情
- C#定义并实现单链表实例解析
- C# Pointer指针应用实例简述
- C++智能指针实例详解
- C++指向函数的指针实例解析
- 关于c语言指针的两处小tip分享
- 浅析iterator与指针的区别
- 探讨C++中数组名与指针的用法比较分析
- 详解C++中的指针、数组指针与函数指针
- C语言实现单链表逆序与逆序输出实例
- C++中字符串以及数组和指针的互相使用讲解
- C语言安全之数组长度与指针实例解析
- C++中指向对象的常指针与指向常对象的指针详解
- 指向变量的常指针与指向常变量的指针详细解析
- C#通过指针实现快速拷贝的方法
- php中将指针移动到数据集初始位置的实现代码[mysql_data_seek]
- C#通过指针读取文件的方法
- C语言指针学习经验总结浅谈
- C语言单链表常见操作汇总
- C++交换指针实例