ewlist=newlist->next;
}
if (list1)
{
newlist->next=list1;
}
if (list2)
{
newlist->next=list2;
}
return list;
}
面试题八:查找单链表的中间节点,要求只能遍历一次链表
SListNode* SListFindMidNode(SListNode* list)//8.查找单链表的中间节点,要求只能遍历一次链表
{
SListNode *cur=NULL;//应用了快慢指针,快指针的速度是慢指针二倍,当快指针走到NULL时,慢指针所指的就是中间节点。
SListNode *fast=NULL;
cur=fast=list;
while (fast && fast->next)
{
cur=cur->next;
fast=fast->next->next;
}
return cur;
}
面试题九:查找单链表的倒数第k个节点,要求只能遍历一次链表
SListNode* SListFindTailKNode(SListNode* list, size_t k)//9.查找单链表的倒数第k个节点,要求只能遍历一次链表
{
SListNode *cur,*fast;//一样用了快慢指针
cur=fast=list;
while(k--)
{
if (fast==NULL)
{
return 0;
}
fast=fast->next;
}
while(fast)
{
fast=fast->next;
cur=cur->next;
}
return cur;
}
面试题十:删除链表的倒数第K个结点
void SListFindPop(SListNode *list,size_t k)//10.删除链表的倒数第K个结点
{
SListNode *cur=NULL;
SListNode *tail=list;
cur=SListFindTailKNode(list,k);
while(list->next!=cur)
{
list=list->next;
}
list->next=cur->next;
free(cur);
}
面试题十一:判断是否带环
SListNode* SListIsCycle(SListNode* list)//11.判断是否带环
{
SListNode *cur,*fast;
cur=fast=list;
while (fast && fast->next)
{
cur=cur->next;
fast=fast->next->next;
if (fast==cur)
{
return cur;
}
}
return NULL;
}
面试题十二:求环的长度
int SListCycleLen(SListNode* meetNode)//12.求环的长度
{
int n=1;
SListNode *cur=meetNode;
while(cur->next!=meetNode)
{
++n;
cur=cur->next;
}
return n;
}
面试题十三:求环的入口点(环的入口点就是一个从链表开始另一个从相遇点开,当他们相交的点就是入口点)
SListNode* SListCrossEntreNode(SListNode* list, SListNode* meetNode) //13.求环的入口点(环的入口点就是一个从链表开始另一个从相遇点开,当他们相交的点就是入口点)
{
while (list!=meetNode)
{
list=list->next;
meetNode=meetNode->next;
}
return list;
}
面试题十四:判断两个链表是否相交。(假设链表不带环)
int SListIsCrossNode(SListNode* list1, SListNode* list2)//14.判断两个链表是否相交,若相交,求交点。(假设链表不带环)
{
while (list1 && list1->next)
{
list1=list1->next;
}
while(list2 &&list2->next)
{
list2=list2->next;
}
if (list2==list1 && list1!=NULL)
{
return 1;
}
return 0;
}
面试题十四(2):两个链表相交,求交点。
SListNode *SListEnterNode(SListNode* list1,SListNode* list2)//两个链表相交,求交点。
{
SListNode *cur1=list1;
SListNode *cur2=list2;
int n1=0;
int n2=0;
while (cur1->next)
{
n1++;
cur1=cur1->next;
}
while (cur2->next)
{
n2++;
cur2=cur2->next;
}
cur1=list1;
cur2=list2;
if (n1-n2 >=0)
{
while (n1-n2!=0)
{
cur1=cur1->next;
n1--;
}
while (cur1!=cur2)
{
cur1=cur1->next;
cur2=cur2->next;
}
}
else
{
while (n2-n1!=0)
{
cur2=cur2->next;
n2--;
}
while (cur1!=cur2)
{
cur1=cur1->next;
cur2=cur2->next;
}
}
return cur1;
}
测试代码:
void Test1()//1.从尾到头打印单链表
{
SListNode *a=NULL;
SListPushBack(&a,1);
SListPushBack(&a,2);
SListPushBack(&a,3);
SListPushBack(&a,4);
SListPushBack(&a,5);
SListPrint(a);
SLitsPrint