链表中倒数第k个结点
2015-08-15 12:00
323 查看
题目
输入一个链表,输出该链表中倒数第k个结点.为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第一个结点.
双指针实现一次遍历就能找到,要注意代码的鲁棒性.
code:
测试代码:
输入一个链表,输出该链表中倒数第k个结点.为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第一个结点.
双指针实现一次遍历就能找到,要注意代码的鲁棒性.
code:
[code]ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) { if (pListHead == NULL || k == 0) { return NULL; } ListNode* pFirst = pListHead; ListNode* pSecond = NULL; for (unsigned int i = 0; i < k - 1; ++i) { if (pFirst->m_pNext != NULL) { pFirst = pFirst->m_pNext; } else { return NULL; } } pSecond = pListHead; while (pFirst->m_pNext != NULL) { pFirst = pFirst->m_pNext; pSecond = pSecond->m_pNext; } return pSecond; }
测试代码:
[code]#include <iostream> using namespace std; struct ListNode { int m_nValue; ListNode* m_pNext; ListNode(int n) : m_nValue(n), m_pNext(NULL) {} }; ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) { if (pListHead == NULL || k == 0) { return NULL; } ListNode* pFirst = pListHead; ListNode* pSecond = NULL; for (unsigned int i = 0; i < k - 1; ++i) { if (pFirst->m_pNext != NULL) { pFirst = pFirst->m_pNext; } else { return NULL; } } pSecond = pListHead; while (pFirst->m_pNext != NULL) { pFirst = pFirst->m_pNext; pSecond = pSecond->m_pNext; } return pSecond; } ListNode* CreateList() { int length; cout << "Enter the length of linklist:"; cin >> length; int number; cout << "Enter the value of each number:"; ListNode* pHead = NULL; ListNode* pTmp = NULL; for (int i = 0; i < length; i++) { cin >> number; ListNode* s = new ListNode(number); if (!pHead) { pHead = s; pTmp = s; } else { pTmp->m_pNext = s; pTmp = s; } } return pHead; } void PrintLinkList(ListNode* pHead) { if (pHead == NULL) return; while (pHead) { cout << pHead->m_nValue <<"-->"; pHead = pHead->m_pNext; if (pHead->m_pNext == NULL) { cout << pHead->m_nValue <<"^"; break; } } cout << endl; } void Test() { ListNode* p = CreateList(); PrintLinkList(p); int k; cout << "Enter k: "; cin >> k; ListNode* pTest = FindKthToTail(p,k); if (pTest) { cout << "the kth value to tail is: "<<pTest->m_nValue<<endl; } else { cout << "Error!" <<endl; } } int main() { Test(); return 0; }
相关文章推荐
- 详解约瑟夫环问题及其相关的C语言算法实现
- KMP算法--next数组
- scala学习之函数
- 数组和指针的区别
- Android的提交数据到服务器
- 使用 rsync 服务(二)
- struts2学习笔记(九)struts2内置校验
- LLBLGen Pro v4.2_Patch+Keygen
- 简化IT程序员工作生活的4个窍门
- java中的并行模式之Master-Worker模式
- js漂浮广告实现代码
- android profile memory usage
- hive 配置
- perl环境配置以及Eclipse安装perl开发插件
- 算法-MergeSort
- 最小生成树之kruskal算法
- 网络安全系列之1:安全能力地图简介
- Tomcat修改端口
- 社保压缩
- hdu 5386 Cover(暴力)