鏈表面試題(一)

  • 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);




}
發佈了66 篇原創文章 · 獲贊 19 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章