反转单链表+合并有序单链表+查找单链表中倒数第k个节点--20150924

//题目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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值