链表面试题(一)

  • 1、链表面试题
  • > 从尾到头打印单链表
void SListPrintbacktofirst(SListNode*pHead)
{
    SListNode*prev=NULL;//用来标记起始位置
    SListNode*tail=NULL;//用来标记末位置
    while(tail!=pHead)
    {
        prev=pHead;//每次将prev更新到头结点
        while(prev->_next!=tail)
        {
            prev=prev->_next;
        }
        printf("%d ",prev->_data);
        tail=prev;//末尾向前移一位

    }


}
  • 递归打印
void SListPrintbacktofirst(SListNode*pHead)
{

    if(pHead==NULL)
        return;

    else
    {
       SListPrintbacktofirst(pHead->_next);
       printf("%d ",pHead->_data);
    }

}

这里写图片描述

  • 2、删除一个无头单链表的非尾节点(不能遍历链表)
void SListEraseNotail(SListNode*pos)
{


      SListNode*prev=NULL;
      assert(pos&&pos->_next);
      prev=pos->_next;//保存pos->next的值方便销毁
      pos->_data=prev->_data;
      pos->_next=prev->_next;

      free(prev);


}

这里写图片描述

  • 3、在无头单链表的一个节点前插入一个节点
void SListInsert(SListNode*pos,DataType x)
{    


      SListNode* newNode=BuySListNode(x);//创建一个节点
      newNode->_next=pos->_next;//插入到插入点之后
      pos->_next=newNode;
      newNode->_data=pos->_data;//将原节点的值放入新节点中
      pos->_data=x;//在原节点中插入值x

}

这里写图片描述

  • 4、单链表解决约瑟夫环问题
void SListJosephCircle(SListNode*pHead)
{
   SListNode*cur=pHead;
   SListNode*prev=NULL;
   int k=0;
  while(cur->_next)
   {
     cur=cur->_next;
   }
   cur->_next=pHead;//将链表链接成环
   while(pHead!=pHead->_next)
   {
       pHead=pHead->_next;
       k++;
    if(k==2)//每三步杀死一次
     {
       prev=pHead->_next;
       pHead->_next=prev->_next;
       k=0;
       free(prev);
       prev=NULL;
     }

   }
  printf("%d\n",pHead->_data);




}

猜你喜欢

转载自blog.csdn.net/adzn1/article/details/79859891