单链表面试题(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