当前位置: 首页 > news >正文

链表中倒数第k个结点-C++

分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击人工智能教程https://www.captainai.net/troubleshooter

// 面试题22:链表中倒数第k个结点 // 题目:输入一个链表,输出该链表中倒数第k个结点。为了符合大多数人的习惯, // 本题从1开始计数,即链表的尾结点是倒数第1个结点。例如一个链表有6个结点, // 从头结点开始它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个结点是 // 值为4的结点。 #include <cstdio> #include <stdio.h> #include <stdlib.h> struct ListNode { int m_nValue; ListNode *m_pNext; }; ListNode *CreateListNode(int value) { ListNode *pNode = new ListNode(); pNode->m_nValue = value; pNode->m_pNext = nullptr; return pNode; } void ConnectListNodes(ListNode *pCurrent, ListNode *pNext) { if (pCurrent == nullptr) { printf("Error to connect two nodes.\n"); exit(1); } pCurrent->m_pNext = pNext; } void PrintListNode(ListNode *pNode) { if (pNode == nullptr) { printf("The node is nullptr\n"); } else { printf("The key in node is %d.\n", pNode->m_nValue); } } void PrintList(ListNode *pHead) { printf("PrintList starts.\n"); ListNode *pNode = pHead; while (pNode != nullptr) { printf("%d\t", pNode->m_nValue); pNode = pNode->m_pNext; } printf("\nPrintList ends.\n"); } void DestroyList(ListNode *pHead) { ListNode *pNode = pHead; while (pNode != nullptr) { pHead = pHead->m_pNext; delete pNode; pNode = pHead; } } void AddToTail(ListNode **pHead, int value) { ListNode *pNew = new ListNode(); pNew->m_nValue = value; pNew->m_pNext = nullptr; if (*pHead == nullptr) { *pHead = pNew; } else { ListNode *pNode = *pHead; while (pNode->m_pNext != nullptr) pNode = pNode->m_pNext; pNode->m_pNext = pNew; } } void RemoveNode(ListNode **pHead, int value) { if (pHead == nullptr || *pHead == nullptr) return; ListNode *pToBeDeleted = nullptr; if ((*pHead)->m_nValue == value) { pToBeDeleted = *pHead; *pHead = (*pHead)->m_pNext; } else { ListNode *pNode = *pHead; while (pNode->m_pNext != nullptr && pNode->m_pNext->m_nValue != value) pNode = pNode->m_pNext; if (pNode->m_pNext != nullptr && pNode->m_pNext->m_nValue == value) { pToBeDeleted = pNode->m_pNext; pNode->m_pNext = pNode->m_pNext->m_pNext; } } if (pToBeDeleted != nullptr) { delete pToBeDeleted; pToBeDeleted = nullptr; } } ListNode *FindKthToTail(ListNode *pListHead, unsigned int k) { if (pListHead == nullptr || k == 0) return nullptr; ListNode *pAhead = pListHead; ListNode *pBehind = nullptr; for (unsigned int i = 0; i < k - 1; ++i) { if (pAhead->m_pNext != nullptr) pAhead = pAhead->m_pNext; else { return nullptr; } } pBehind = pListHead; 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(); return 0; } // ------ Output ------ /* =====Test1 starts:===== expected result: 4. The key in node is 4. =====Test2 starts:===== expected result: 5. The key in node is 5. =====Test3 starts:===== expected result: 1. The key in node is 1. =====Test4 starts:===== expected result: nullptr. The node is nullptr =====Test5 starts:===== expected result: nullptr. The node is nullptr =====Test6 starts:===== expected result: nullptr. The node is nullptr */
http://www.jsqmd.com/news/712161/

相关文章:

  • 别再为CWRU轴承数据发愁了!一个Python函数搞定数据读取与划分(附完整代码)
  • ARM GICv3虚拟中断控制器与ICV_HPPIR1_EL1寄存器详解
  • 多项式优化框架设计与Julia实现实践
  • 解锁macOS视频预览新境界:QuickLookVideo全面解析与实战指南
  • Leetcode刷题总结-3.二叉树篇
  • 实战:在华为Atlas 300i Pro上部署YOLOv5模型进行目标检测(MindSpore+CANN)
  • 终极Django REST Framework数据分析指南:API使用统计与业务洞察实战
  • RPG Maker Decrypter技术深度解析:三版本加密算法实现与架构设计
  • 视觉因果发现:ToCT方法与CauSight模型解析
  • GAN判别器增强技术与对抗训练优化策略
  • Arm Cortex-X925错误记录寄存器架构与RAS技术解析
  • Shark007 Advanced Codecs
  • 安吉办公椅生产厂家有哪些?2026办公网椅生产厂/人体工学椅/安吉办公椅源头工厂调研-商用座椅领军好物精选 - 栗子测评
  • mousemaster:用键盘驱动鼠标,提升效率与缓解RSI的终极方案
  • 别再只用MaxPooling了!用PyTorch手把手实现小波池化层,提升图像分类的抗噪能力
  • 园林绿化公司哪家好?2026浙江苗木绿化/小区绿化苗木/园林绿化公司实力分析-园林苗木服务领军机构优选推荐 - 栗子测评
  • G-Helper终极指南:免费掌控华硕笔记本的完整解决方案
  • 视觉自回归模型多样性优化与多尺度生成技术
  • 大模型的工程原理 第7章 Mixture of Experts(MoE)架构
  • 2.1 链路层发现协议(LLDP)
  • 2026年4月白酒经销商厂家名录:成都白酒批发厂家、散装白酒生产厂家、浓香型白酒厂家、白酒代理加盟厂家、白酒厂家电话选择指南 - 优质品牌商家
  • 链表中环的入口结点-C++
  • 2026年3月高效的宠物医院运营托管团队推荐,宠物医院代运营/宠物医生美团运营,宠物医院运营托管品牌怎么选择 - 品牌推荐师
  • 如何利用Turborepo实现TypeScript项目的类型安全构建流程优化
  • 多项式优化与半定规划松弛的计算挑战与优化策略
  • 红外线桥切机哪家好?桥切机厂家有哪些?2026年桥切机厂家推荐:福建晶洋领衔 - 栗子测评
  • 2026乐山油炸工艺解析:乐山美食攻略、乐山美食街、乐山美食订餐热线、乐山辜李坝老地方油炸、乐山市区美食、乐山当地人去的美食街选择指南 - 优质品牌商家
  • 深度解析AssetStudio:从Unity资源提取到Lua字节码反编译的完整解决方案
  • Python 上下文管理器:高级应用
  • YOLOv8搭配5大跟踪算法实测对比:DeepOCSort、StrongSORT、OCSort、ByteTrack、BoT-SORT哪个更适合你的项目?