1. 程式人生 > 其它 >連結串列倒數第k個節點_(22)C++面試之連結串列中倒數第k個節點

連結串列倒數第k個節點_(22)C++面試之連結串列中倒數第k個節點

技術標籤:連結串列倒數第k個節點

d3776a177329da15b5ad3d8ba2cf059c.png

// 面試題22:連結串列中倒數第k個結點

// 題目:輸入一個連結串列,輸出該連結串列中倒數第k個結點。為了符合大多數人的習慣,

// 本題從1開始計數,即連結串列的尾結點是倒數第1個結點。例如一個連結串列有6個結點,

// 從頭結點開始它們的值依次是1、2、3、4、5、6。這個連結串列的倒數第3個結點是

// 值為4的結點。

//連結串列定義
struct ListNode
{
  int m_nValue;

  ListNode* m_pNext;
}

//採用倆個指標,一個到尾,另一個正好指向當前值
ListNode* FindKthToTail(ListNode* pListHead,unsigned int k)
{

   if(pListHead==nullptr||k==0)
        return;

   ListNode *pAhead=pListHead;
   ListNode *pBhead=nullptr;

   for(unsigned int i=0;i<k-1;i++)
    {   
          if(pAhead->m_pNext!=nullptr)
                  pAhead=pAhead->m_pNext;
          else
             {  return nullptr;}

   }

  pBhead=pListNode;
   while(pAhead->m_pNext!=nullptr)
   {
          pAhead=pAhead->m_pNext;
          pBhead=pBhead->m_pNext;
   }

    return pBhead;
}


// ====================測試程式碼====================
// 測試要找的結點在連結串列中間
void Test1()
{
    printf("=====Test1 starts:=====n");
    ListNode* pNode1 = CreateListNode(1);
    ListNode* pNode2 = CreateListNode(2);
    ListNode* pNode3 = CreateListNode(3);
    ListNode* pNode4 = CreateListNode(4);
    ListNode* pNode5 = CreateListNode(5);

    ConnectListNodes(pNode1, pNode2);
    ConnectListNodes(pNode2, pNode3);
    ConnectListNodes(pNode3, pNode4);
    ConnectListNodes(pNode4, pNode5);

    printf("expected result: 4.n");
    ListNode* pNode = FindKthToTail(pNode1, 2);
    PrintListNode(pNode);

    DestroyList(pNode1);
}

// 測試要找的結點是連結串列的尾結點
void Test2()
{
    printf("=====Test2 starts:=====n");
    ListNode* pNode1 = CreateListNode(1);
    ListNode* pNode2 = CreateListNode(2);
    ListNode* pNode3 = CreateListNode(3);
    ListNode* pNode4 = CreateListNode(4);
    ListNode* pNode5 = CreateListNode(5);

    ConnectListNodes(pNode1, pNode2);
    ConnectListNodes(pNode2, pNode3);
    ConnectListNodes(pNode3, pNode4);
    ConnectListNodes(pNode4, pNode5);

    printf("expected result: 5.n");
    ListNode* pNode = FindKthToTail(pNode1, 1);
    PrintListNode(pNode);

    DestroyList(pNode1);
}

// 測試要找的結點是連結串列的頭結點
void Test3()
{
    printf("=====Test3 starts:=====n");
    ListNode* pNode1 = CreateListNode(1);
    ListNode* pNode2 = CreateListNode(2);
    ListNode* pNode3 = CreateListNode(3);
    ListNode* pNode4 = CreateListNode(4);
    ListNode* pNode5 = CreateListNode(5);

    ConnectListNodes(pNode1, pNode2);
    ConnectListNodes(pNode2, pNode3);
    ConnectListNodes(pNode3, pNode4);
    ConnectListNodes(pNode4, pNode5);

    printf("expected result: 1.n");
    ListNode* pNode = FindKthToTail(pNode1, 5);
    PrintListNode(pNode);

    DestroyList(pNode1);
}

// 測試空連結串列
void Test4()
{
    printf("=====Test4 starts:=====n");
    printf("expected result: nullptr.n");
    ListNode* pNode = FindKthToTail(nullptr, 100);
    PrintListNode(pNode);
}

// 測試輸入的第二個引數大於連結串列的結點總數
void Test5()
{
    printf("=====Test5 starts:=====n");
    ListNode* pNode1 = CreateListNode(1);
    ListNode* pNode2 = CreateListNode(2);
    ListNode* pNode3 = CreateListNode(3);
    ListNode* pNode4 = CreateListNode(4);
    ListNode* pNode5 = CreateListNode(5);

    ConnectListNodes(pNode1, pNode2);
    ConnectListNodes(pNode2, pNode3);
    ConnectListNodes(pNode3, pNode4);
    ConnectListNodes(pNode4, pNode5);

    printf("expected result: nullptr.n");
    ListNode* pNode = FindKthToTail(pNode1, 6);
    PrintListNode(pNode);

    DestroyList(pNode1);
}

// 測試輸入的第二個引數為0
void Test6()
{
    printf("=====Test6 starts:=====n");
    ListNode* pNode1 = CreateListNode(1);
    ListNode* pNode2 = CreateListNode(2);
    ListNode* pNode3 = CreateListNode(3);
    ListNode* pNode4 = CreateListNode(4);
    ListNode* pNode5 = CreateListNode(5);

    ConnectListNodes(pNode1, pNode2);
    ConnectListNodes(pNode2, pNode3);
    ConnectListNodes(pNode3, pNode4);
    ConnectListNodes(pNode4, pNode5);

    printf("expected result: nullptr.n");
    ListNode* pNode = FindKthToTail(pNode1, 0);
    PrintListNode(pNode);

    DestroyList(pNode1);
}

int main(int argc, char* argv[])
{
    Test1();
    Test2();
    Test3();
    Test4();
    Test5();
    Test6();

    return 0;
}