連結串列倒數第k個節點_(22)C++面試之連結串列中倒數第k個節點
阿新 • • 發佈:2021-01-23
技術標籤:連結串列倒數第k個節點
// 面試題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; }