您的位置:首页 > 其它

反转单链表+合并有序单链表+查找单链表中倒数第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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  单链表 指针