1. 程式人生 > >《劍指offer》第二十二題(鏈表中倒數第k個結點)

《劍指offer》第二十二題(鏈表中倒數第k個結點)

st3 大於 ndk 輸入 The col printf find cte

// 面試題22:鏈表中倒數第k個結點
// 題目:輸入一個鏈表,輸出該鏈表中倒數第k個結點。為了符合大多數人的習慣,
// 本題從1開始計數,即鏈表的尾結點是倒數第1個結點。例如一個鏈表有6個結點,
// 從頭結點開始它們的值依次是1、2、3、4、5、6。這個鏈表的倒數第3個結點是
// 值為4的結點。

//O(n)的解法:維護兩個指針,讓A走B前頭,前K步,A到頭,B就是解了,但是這個問題在於程序魯棒性
#include <iostream>
#include "List.h"

ListNode* FindKthToTail(ListNode* pListHead, unsigned int
k)//註意無符號K { if (pListHead == nullptr || k == 0)//魯棒檢查一:頭結點和K不能為0 return nullptr; ListNode *pAhead = pListHead; ListNode *pBehind = pListHead; for (unsigned int i = 0; i < k - 1; ++i) { if (pAhead->m_pNext != nullptr)//魯棒檢測二:得有K個節點 pAhead = pAhead->m_pNext;
else { return nullptr; } } while (pAhead->m_pNext != nullptr) { pAhead = pAhead->m_pNext; pBehind = pBehind->m_pNext; } return pBehind; } // ====================測試代碼==================== // 測試要找的結點在鏈表中間 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(); system("pause"); return 0; }

技術分享圖片

《劍指offer》第二十二題(鏈表中倒數第k個結點)