面试题15、输入一个链表,输出该链表中倒数第k个结点。
2015-11-29 16:08
525 查看
/* brief: 输入一个链表,输出该链表中倒数第k个结点。 */ #include "stdafx.h" #include "List.h" ListNode *FindKthToTail(ListNode *pListHead, unsigned int k) { if(pListHead == NULL || k == 0) return NULL; ListNode *pAhead = pListHead; ListNode *pBehind = NULL; for(unsigned int i = 0; i < k - 1; ++i) { if(pAhead->m_pNext != NULL) pAhead = pAhead->m_pNext; else return NULL; } pBehind = pListHead; while(pAhead->m_pNext != NULL) { 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: NULL.\n"); ListNode* pNode = FindKthToTail(NULL, 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: NULL.\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: NULL.\n"); ListNode* pNode = FindKthToTail(pNode1, 0); PrintListNode(pNode); DestroyList(pNode1); } int _tmain(int argc, _TCHAR *argv[]) { Test1(); Test2(); Test3(); Test4(); Test5(); Test6(); return 0; } <pre name="code" class="cpp"> struct ListNode { int m_nValue; ListNode * m_pNext; }; __declspec(dllexport) ListNode *CreateListNode(int value); __declspec(dllexport) void ConnectListNodes(ListNode *pCurrent, ListNode *pNext); __declspec(dllexport) void PrintListNode(ListNode *pNode); __declspec(dllexport) void DestroyList(ListNode *pHead);
#include "List.h" #include "stdafx.h" #include <stdio.h> #include <stdlib.h> ListNode *CreateListNode(int value) { ListNode *pNode = new ListNode(); pNode->m_nValue = value; pNode->m_pNext = NULL; return pNode; } void ConnectListNodes(ListNode *pCurrent, ListNode *pNext) { if(pCurrent == NULL) { printf("Error to connect two nodes.\n"); exit(1); // exit(1)表示异常退出.这个1是返回给操作系统的。 } pCurrent->m_pNext = pNext; } void PrintListNode(ListNode *pNode) { if(pNode == NULL) printf("The node is NULL\n"); else printf("The key in node is %d.\n", pNode->m_nValue); } void DestroyList(ListNode *pHead) { ListNode * pNode = pHead; while(pNode != NULL) { pHead = pHead->m_pNext; delete pNode; pNode = pHead; } }
相关文章推荐
- 海量数据处理
- 一个java程序员自学IOS开发之路(十)
- 求职应聘时面试常见问题2
- 求职应聘时面试常见问题1
- 程序员自学的那些事
- 每个程序员都应该了解的 CPU 高速缓存
- 英语四级-面对让我备受挫折、不断回避、留有心结的考验
- 黑马程序员—Java基础—正则表达式
- 程序员技术练级攻略
- 谈谈Java程序员进阶的那些知识和方向
- Android面试题精选
- Android面试题精选,自己收藏下
- 黑马程序员—Java基础—数组
- 黑马程序员—java基础—常用API
- 栈和队列的区别是啥? 吃多了拉就是队列;吃多了吐就是栈(程序员段子)
- 远古程序员
- 黑马程序员—Java基础—面向对象
- 黑马程序员—Java基础知识汇总
- 黑马程序员——javaSE_IO流
- 黑马程序员——javaSE_集合框架-Map